成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

正則表達(dá)式及多語(yǔ)言操作指南

ingood / 3413人閱讀

摘要:能匹配中的,但不能匹配中的數(shù)量界定符符號(hào)定義是一個(gè)非負(fù)整數(shù)。則等價(jià)于和均為非負(fù)整數(shù),其中。該方法接受一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù)。是一個(gè)非強(qiáng)制異常類,它表示一個(gè)正則表達(dá)式模式中的語(yǔ)法錯(cuò)誤。

正則表達(dá)式及多語(yǔ)言操作指南 1. 正則表達(dá)式
正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對(duì)字符串的一種過濾邏輯。
正則表達(dá)式是對(duì)字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對(duì)字符串的一種過濾邏輯。正則表達(dá)式是一種文本模式,模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串。
1.1 正則表達(dá)式符號(hào) 1.1.1 符號(hào)類

通用的符號(hào):

符號(hào) 含義 范例
. 任意字符 “A”, “ ”(空格), “囧”, “1”
d 匹配一個(gè)數(shù)字字符。等價(jià)于[0-9] “1”, “2”, “3”
D 匹配一個(gè)非數(shù)字字符。等價(jià)于[^0-9] “a”, “b”, “c”
w 匹配包括下劃線的任何單詞字符。等價(jià)于“[A-Za-z0-9_]” “Y”, “x”, “_”, “9”
W 匹配任何非單詞字符。等價(jià)于“[^A-Za-z0-9_]” “ ”(空格)
s 匹配任何空白字符,包括空格、制表符、換頁(yè)符等等。等價(jià)于[ fnrtv] “ ”(空格), “r”, “t”, “n”
S 匹配任何非空白字符。等價(jià)于[^fnrtv] “B”, “囧”, “5”

特殊的符號(hào):

符號(hào) 含義 范例
r 匹配一個(gè)回車符。等價(jià)于x0d和cM
f 匹配一個(gè)換頁(yè)符。等價(jià)于x0c和cL
n 匹配一個(gè)換行符。等價(jià)于x0a和cJ
t 匹配一個(gè)制表符。等價(jià)于x09和cI
匹配 “”
xhh 以ASCII碼進(jìn)?匹配 x41可以匹配”A”
uhhhh 以UNICODE碼進(jìn)?匹配 u4e00-u9fa5 中?的范圍

重點(diǎn):關(guān)于 .

單行模式下(gs):能匹配
多行模式下(gm):不能匹配

1.1.2 字符集合
符號(hào) 含義
[a-z] 字符范圍。匹配指定范圍內(nèi)的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內(nèi)的任意小寫字母字符
[abc] 字符集合。匹配所包含的任意一個(gè)字符。例如,“[abc]”可以匹配“plain”中的“a”
[^xyz] 負(fù)值字符集合。匹配未包含的任意字符。例如,“1”可以匹配“plain”中的“p”
[^a-c] 負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,“2”可以匹配任何不在“a”到“z”范圍內(nèi)的任意字符
[-] 匹配 “-”
1.1.3 字符邊界
符號(hào) 含義
^ 匹配輸入字符串的開始位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,^也匹配“n”或“r”之后的位置
& 匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,$也匹配“n”或“r”之前的位置
 匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。例如,“erb”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”
B 匹配非單詞邊界?!癳rB”能匹配“verb”中的“er”,但不能匹配“never”中的“er”
1.1.4 數(shù)量界定符
符號(hào) 定義
x{n} n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個(gè)o
x{n,} n是一個(gè)非負(fù)整數(shù)。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o?!皁{1,}”等價(jià)于“o+”。“o{0,}”則等價(jià)于“o*”
x{n,m} m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個(gè)o?!皁{0,1}”等價(jià)于“o?”。請(qǐng)注意在逗號(hào)和兩個(gè)數(shù)之間不能有空格
x* 匹配前面的子表達(dá)式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價(jià)于{0,}
x+ 匹配前面的子表達(dá)式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價(jià)于{1,}
x? 匹配前面的子表達(dá)式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等價(jià)于{0,1}

重點(diǎn):關(guān)于 ?

貪婪模式下:數(shù)量限定符都是在滿?條件下盡可能的匹配更多的字符
非貪婪模式下:如果希望在滿?條件下盡可能少的匹配字符, 在數(shù)量限定符后?加上“?”

1.1.5 分支條件
符號(hào) 定義
x y 匹配x或y。例如,“z food”能匹配“z”或“food”?!?z f)ood”則匹配“zood”或“food”。
1.1.6 分組與后向引?
符號(hào) 定義
(x) 匹配pattern并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號(hào)字符,請(qǐng)使用“(”或“)”
1..n 引?第1-n組匹配
(?:x) 匹配pattern但不獲取匹配結(jié)果,也就是說這是一個(gè)非獲取匹配,不進(jìn)行存儲(chǔ)供以后使用。這在使用或字符“( )”來組合一個(gè)模式的各個(gè)部分是很有用。例如“industr(?:y ies)”就是一個(gè)比“industry industries”更簡(jiǎn)略的表達(dá)式
1.1.7 斷?
符號(hào) 定義
(?=pattern) 正向肯定預(yù)查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,“Windows(?=95 98 NT 2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預(yù)查不消耗字符,也就是說,在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始
(?!pattern) 正向否定預(yù)查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個(gè)非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如“Windows(?!95 98 NT 2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。預(yù)查不消耗字符,也就是說,在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始
(?<=pattern) 反向肯定預(yù)查,與正向肯定預(yù)查類擬,只是方向相反。例如,“(?<=95 98 NT 2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”
(? 反向否定預(yù)查,與正向否定預(yù)查類擬,只是方向相反。例如“(? 98 NT 2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”
1.2 正則表達(dá)式網(wǎng)站

以下是常用的一些在線正則表達(dá)式測(cè)試工具,其中個(gè)人感覺第一個(gè)最好!

http://regex101.com/

http://regexr.com/

http://tool.lu/regex/

http://tool.oschina.net/regex/

http://tool.chinaz.com/regex/

1.3 正則表達(dá)式工具

RegexBuddy

RegexMagic

1.4 常用的正則表達(dá)式
需求 正則表達(dá)式
用戶名 ^[a-z0-9_-]{3,16}$
密碼 ^[a-z0-9_-]{6,18}$
十六進(jìn)制值 ^#?([a-f0-9]{6} [a-f0-9]{3})$
電子郵箱 ^([a-z0-9_.-]+)@([da-z.-]+).([a-z.]{2,6})$/
URL ^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$
IP 地址 /((2[0-4]d 25[0-5] [01]?dd?).){3}(2[0-4]d 25[0-5] [01]?dd?)/
/^(?:(?:25[0-5] 20-4 [01]?0-9?).){3}(?:25[0-5] 20-4 [01]?0-9?)$/
HTML 標(biāo)簽 ^<([a-z]+)([^<]+)*(?:>(.*) s+/>)$
刪除代碼注釋 (? S)//.*$
Unicode編碼中的漢字范圍 ^[u2E80-u9FFF]+$
一個(gè)單詞連續(xù)出現(xiàn)的位置 b([a-z]+) 1b/gi
匹配空行 ^s*$
匹配中文字符 [u4e00-u9fa5]
匹配雙字節(jié)字符(包括漢字在內(nèi)) [^x00-xff]
匹配空白行 ns*r
匹配國(guó)內(nèi)電話號(hào)碼 d{3}-d{8} d{4}-{7,8}
匹配騰訊QQ號(hào) 1-9{4,}
匹配中國(guó)郵政編碼 [1-9]d{5}(?!d)
匹配18位身份證號(hào) ^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9] X)$
匹配(年-月-日)格式日期 ([0-9]{3}[1-9]
匹配正浮點(diǎn)數(shù) ^[1-9]d*.d* 0.d*[1-9]d*$
匹配負(fù)浮點(diǎn)數(shù) ^-[1-9]d*.d* -0.d*[1-9]d*$
2. Python操作正則表達(dá)式
參考文獻(xiàn):https://www.liaoxuefeng.com/w...
2.1 匹配字符串

Python提供re模塊,包含所有正則表達(dá)式的功能。由于Python的字符串本身也用轉(zhuǎn)義,所以要特別注意:

s = "ABC-001" # Python的字符串
# 對(duì)應(yīng)的正則表達(dá)式字符串變成:
# "ABC-001"

因此我們強(qiáng)烈建議使用Python的r前綴,就不用考慮轉(zhuǎn)義的問題了:

s = r"ABC-001" # Python的字符串
# 對(duì)應(yīng)的正則表達(dá)式字符串不變:
# "ABC-001"

先看看如何判斷正則表達(dá)式是否匹配:

>>> import re
>>> re.match(r"^d{3}-d{3,8}$", "010-12345")
<_sre.SRE_Match object; span=(0, 9), match="010-12345">
>>> re.match(r"^d{3}-d{3,8}$", "010 12345")
>>>

match()方法判斷是否匹配,如果匹配成功,返回一個(gè)Match對(duì)象,否則返回None。常見的判斷方法就是:

test = "用戶輸入的字符串"
if re.match(r"正則表達(dá)式", test):
    print("ok")
else:
    print("failed")
2.2 切分字符串

用正則表達(dá)式切分字符串比用固定的字符更靈活,請(qǐng)看正常的切分代碼:

>>> "a b   c".split(" ")
["a", "b", "", "", "c"]

嗯,無法識(shí)別連續(xù)的空格,用正則表達(dá)式試試:

>>> re.split(r"s+", "a b   c")
["a", "b", "c"]

無論多少個(gè)空格都可以正常分割。加入,試試:

>>> re.split(r"[s,]+", "a,b, c  d")
["a", "b", "c", "d"]

再加入;試試:

>>> re.split(r"[s,;]+", "a,b;; c  d")
["a", "b", "c", "d"]

如果用戶輸入了一組標(biāo)簽,下次記得用正則表達(dá)式來把不規(guī)范的輸入轉(zhuǎn)化成正確的數(shù)組。

2.3 分組

除了簡(jiǎn)單地判斷是否匹配之外,正則表達(dá)式還有提取子串的強(qiáng)大功能。用()表示的就是要提取的分組(Group)。比如:

^(d{3})-(d{3,8})$分別定義了兩個(gè)組,可以直接從匹配的字符串中提取出區(qū)號(hào)和本地號(hào)碼:

>>> m = re.match(r"^(d{3})-(d{3,8})$", "010-12345")
>>> m
<_sre.SRE_Match object; span=(0, 9), match="010-12345">
>>> m.group(0)
"010-12345"
>>> m.group(1)
"010"
>>> m.group(2)
"12345"

如果正則表達(dá)式中定義了組,就可以在Match對(duì)象上用group()方法提取出子串來。

注意到group(0)永遠(yuǎn)是原始字符串,group(1)、group(2)……表示第1、2、……個(gè)子串。

提取子串非常有用。來看一個(gè)更兇殘的例子:

>>> t = "19:05:30"
>>> m = re.match(r"^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$", t)
>>> m.groups()
("19", "05", "30")

這個(gè)正則表達(dá)式可以直接識(shí)別合法的時(shí)間。但是有些時(shí)候,用正則表達(dá)式也無法做到完全驗(yàn)證,比如識(shí)別日期:

"^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$"

對(duì)于"2-30","4-31"這樣的非法日期,用正則還是識(shí)別不了,或者說寫出來非常困難,這時(shí)就需要程序配合識(shí)別了。

2.4 貪婪匹配

最后需要特別指出的是,正則匹配默認(rèn)是貪婪匹配,也就是匹配盡可能多的字符。舉例如下,匹配出數(shù)字后面的0

>>> re.match(r"^(d+)(0*)$", "102300").groups()
("102300", "")

由于d+采用貪婪匹配,直接把后面的0全部匹配了,結(jié)果0*只能匹配空字符串了。

必須讓d+采用非貪婪匹配(也就是盡可能少匹配),才能把后面的0匹配出來,加個(gè)?就可以讓d+采用非貪婪匹配:

>>> re.match(r"^(d+?)(0*)$", "102300").groups()
("1023", "00")
2.5 編譯

當(dāng)我們?cè)赑ython中使用正則表達(dá)式時(shí),re模塊內(nèi)部會(huì)干兩件事情:

編譯正則表達(dá)式,如果正則表達(dá)式的字符串本身不合法,會(huì)報(bào)錯(cuò);

用編譯后的正則表達(dá)式去匹配字符串。

如果一個(gè)正則表達(dá)式要重復(fù)使用幾千次,出于效率的考慮,我們可以預(yù)編譯該正則表達(dá)式,接下來重復(fù)使用時(shí)就不需要編譯這個(gè)步驟了,直接匹配:

>>> import re
# 編譯:
>>> re_telephone = re.compile(r"^(d{3})-(d{3,8})$")
# 使用:
>>> re_telephone.match("010-12345").groups()
("010", "12345")
>>> re_telephone.match("010-8086").groups()
("010", "8086")

編譯后生成Regular Expression對(duì)象,由于該對(duì)象自己包含了正則表達(dá)式,所以調(diào)用對(duì)應(yīng)的方法時(shí)不用給出正則字符串。

3. Java操作正則表達(dá)式
參考文獻(xiàn):http://www.runoob.com/java/ja...
3.1 基礎(chǔ)

Java提供了java.util.regex 包來操作正則表達(dá)式,主要包含以下三個(gè)類:

Pattern 類:pattern 對(duì)象是一個(gè)正則表達(dá)式的編譯表示。Pattern 類沒有公共構(gòu)造方法。要?jiǎng)?chuàng)建一個(gè) Pattern 對(duì)象,你必須首先調(diào)用其公共靜態(tài)編譯方法,它返回一個(gè) Pattern 對(duì)象。該方法接受一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù)。

Matcher 類:Matcher 對(duì)象是對(duì)輸入字符串進(jìn)行解釋和匹配操作的引擎。與Pattern 類一樣,Matcher 也沒有公共構(gòu)造方法。你需要調(diào)用 Pattern 對(duì)象的 matcher 方法來獲得一個(gè) Matcher 對(duì)象。

PatternSyntaxException:PatternSyntaxException 是一個(gè)非強(qiáng)制異常類,它表示一個(gè)正則表達(dá)式模式中的語(yǔ)法錯(cuò)誤。

以下實(shí)例中使用了正則表達(dá)式 .*runoob.* 用于查找字符串中是否包了 runoob 子串:

import java.util.regex.*;
 
class RegexExample1{
   public static void main(String args[]){
      String content = "I am noob " +
        "from runoob.com.";
 
      String pattern = ".*runoob.*";
 
      boolean isMatch = Pattern.matches(pattern, content);
      System.out.println("字符串中是否包含了 "runoob" 子字符串? " + isMatch);
   }
}

輸出:

字符串中是否包含了 "runoob" 子字符串? true
3.2 捕獲組

捕獲組是把多個(gè)字符當(dāng)一個(gè)多帶帶單元進(jìn)行處理的方法,它通過對(duì)括號(hào)內(nèi)的字符分組來創(chuàng)建。
例如,正則表達(dá)式 (dog) 創(chuàng)建了單一分組,組里包含"d","o",和"g"。
捕獲組是通過從左至右計(jì)算其開括號(hào)來編號(hào)。例如,在表達(dá)式((A)(B(C))),有四個(gè)這樣的組:

((A)(B(C)))

(A)

(B(C))

(C)

可以通過調(diào)用 matcher 對(duì)象的 groupCount 方法來查看表達(dá)式有多少個(gè)分組。groupCount 方法返回一個(gè) int 值,表示matcher對(duì)象當(dāng)前有多個(gè)捕獲組。
還有一個(gè)特殊的組(group(0)),它總是代表整個(gè)表達(dá)式。該組不包括在 groupCount 的返回值中。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    public static void main( String args[] ){
 
      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(D*)(d+)(.*)";
 
      // 創(chuàng)建 Pattern 對(duì)象
      Pattern r = Pattern.compile(pattern);
 
      // 現(xiàn)在創(chuàng)建 matcher 對(duì)象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
         System.out.println("Found value: " + m.group(3) ); 
      } else {
         System.out.println("NO MATCH");
      }
   }
}

輸出:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT
Found value: 3000
Found value: ! OK?
4. C#操作正則表達(dá)式
參考文獻(xiàn):http://www.runoob.com/csharp/...

使用的命名空間 using System.Text.RegularExpressions;

C#中主要使用Regex類來操作正則表達(dá)式,其常用的方法如下:

public bool IsMatch( string input )? 指示 Regex 構(gòu)造函數(shù)中指定的正則表達(dá)式是否在指定的輸入字符串中找到匹配項(xiàng)
public bool IsMatch( string input, int startat )? 指示 Regex 構(gòu)造函數(shù)中指定的正則表達(dá)式是否在指定的輸入字符串中找到匹配項(xiàng),從字符串中指定的開始位置開始
public static bool IsMatch( string input, string pattern )? 指示指定的正則表達(dá)式是否在指定的輸入字符串中找到匹配項(xiàng)
public MatchCollection Matches( string input )? 在指定的輸入字符串中搜索正則表達(dá)式的所有匹配項(xiàng)

public string Replace( string input, string replacement )?

| 在指定的輸入字符串中,把所有匹配正則表達(dá)式模式的所有匹配的字符串替換為指定的替換字符串 |
| public string[] Split( string input )? | 把輸入字符串分割為子字符串?dāng)?shù)組,根據(jù)在 Regex 構(gòu)造函數(shù)中指定的正則表達(dá)式模式定義的位置進(jìn)行分割 |

實(shí)例一:下面的實(shí)例匹配了以 "S" 開頭的單詞:

using System;
using System.Text.RegularExpressions;

namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "A Thousand Splendid Suns";

         Console.WriteLine("Matching words that start with "S": ");
         showMatch(str, @"SS*");
         Console.ReadKey();
      }
   }
}

輸出:

Matching words that start with "S":
The Expression: SS*
Splendid
Suns

實(shí)例 2: 下面的實(shí)例匹配了以 "m" 開頭以 "e" 結(jié)尾的單詞:

using System;
using System.Text.RegularExpressions;

namespace RegExApplication
{
   class Program
   {
      private static void showMatch(string text, string expr)
      {
         Console.WriteLine("The Expression: " + expr);
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
      }
      static void Main(string[] args)
      {
         string str = "make maze and manage to measure it";

         Console.WriteLine("Matching words start with "m" and ends with "e":");
         showMatch(str, @"mS*e");
         Console.ReadKey();
      }
   }
}

輸出:

Matching words start with "m" and ends with "e":
The Expression: mS*e
make
maze
manage
measure

實(shí)例 3:下面的實(shí)例替換掉多余的空格:

using System;
using System.Text.RegularExpressions;

namespace RegExApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         string input = "Hello   World   ";
         string pattern = "s+";
         string replacement = " ";
         Regex rgx = new Regex(pattern);
         string result = rgx.Replace(input, replacement);

         Console.WriteLine("Original String: {0}", input);
         Console.WriteLine("Replacement String: {0}", result);    
         Console.ReadKey();
      }
   }
}

輸出:

Original String: Hello   World   
Replacement String: Hello World 
5. C++操作正則表達(dá)式
參考文獻(xiàn):https://blog.csdn.net/makenot...

C++里面使用正則表達(dá)式一般有三種:C regex,C ++regex,boost regex

實(shí)例一:電子郵件

// Regex.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include 
#include 
#include 
#include 
using namespace std;

//電子郵件匹配
bool is_email_valid(const std::string& email)
{
   const regex pattern("(w+)(.|_)?(w*)@(w+)(.(w+))+");
   /****
    const std::regex pattern("(w+)(.|_)?(w*)@(w+)(.(w+))+"); 
   std:: match_results result;
   bool valid = std::regex_match(email, result,pattern);
   //此處result參數(shù)可有可無,result是一個(gè)字符串?dāng)?shù)組,用來存儲(chǔ)正則表達(dá)式里面括號(hào)的內(nèi)容。
   if(valid&&(result.length()>0))
  {
      for(int i =0;i

實(shí)例二:IP

bool is_IPAddress_valid(const std::string& ipaddress)
{
    const std::regex pattern("(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})");
    //三位數(shù)的都可以,沒有設(shè)置1-255 的條件
   std:: match_results result;
  bool valid = std::regex_match(ipaddress, result, pattern);
  if(valid&&(result.length()>0))
  {
      for(int i =0;i

測(cè)試:

int main(int argc,char** argv)
{

    cout<<"測(cè)試4個(gè)電子郵件選項(xiàng)"<
6. Javasript操作正則表達(dá)式
參考文獻(xiàn):http://www.runoob.com/js/js-r...
參考文獻(xiàn):https://www.cnblogs.com/zhuzh...
6.1 JavaScript對(duì)正則表達(dá)式的支持程度

下面的這些都是JavaScript所不支持的:

匹配字符串開始和結(jié)尾的A和Z錨。(但我們?nèi)钥梢允褂胇和$來匹配字符串的開始和結(jié)尾)
向后查找(lookbehind)(注:但是JavaScript完全支持向前查找(lookahead))
并集和交集類
原子組(atomic grouping)
Unicode支持(單個(gè)字符除外,如uFFFF)
命名的捕獲組
s(single,單行)和x(free-spacing,無間隔)匹配模式
條件匹配
正則表達(dá)式注釋

6.2 支持正則表達(dá)式的RegExp類型

JavaScript是通過RegExp類型來支持正則表達(dá)式的。而創(chuàng)建RegExp類型有兩種方法。一種是字面量方法(類似于Perl的語(yǔ)法),另一種是使用JavaScript的RegExp構(gòu)造函數(shù),下面將逐一介紹。

6.2.1 字面量方法
var expression = /pattern/flags;

其中expression即為正則表達(dá)式的名稱,模式(pattern)可以是任何復(fù)雜或簡(jiǎn)單的正則表達(dá)式(但必須是在JavaScript支持范圍內(nèi)的),標(biāo)志(flags)即用來表明正則表達(dá)式行為。

下面介紹JavaScript中支持的三個(gè)標(biāo)志(flags):

g: 表示全局(global)模式,表示pattern會(huì)應(yīng)用于所有字符串,而不是找到一個(gè)匹配項(xiàng)后立即停止。

i :表示不區(qū)分大小寫(ignore)模式。即忽略pattern和字符串的大小寫。

m:表示多行(multiple)模式。 即到一行文本末尾時(shí)還會(huì)繼續(xù)查找下一行中是否存在匹配的項(xiàng)。

說明:在字面量方法中的flags可以是g、i、m中的任意一個(gè)或幾個(gè)且這里的標(biāo)志完全適用于之后要講的RegExp構(gòu)造函數(shù)方法。

舉例:

var pattern=/at/gi;

此字面量形式的正則表達(dá)式表示在不區(qū)分大小寫的情況下在全局范圍內(nèi)匹配at。

6.2.2 RegExp構(gòu)造函數(shù)法
var pattern = new RegExp("pattern","flags");

即這種方法使用了RegExp構(gòu)造函數(shù),并且傳遞了兩個(gè)參數(shù)(同字面量方法),但值得注意的是:pattern(模式)和flags(標(biāo)志)都需要使用引號(hào)括起來。

6.2.3 對(duì)模式中的元字符轉(zhuǎn)義的方法

當(dāng)我們希望使用元字符本身的含義時(shí),我們就需要對(duì)元字符進(jìn)行轉(zhuǎn)義。比如[ab]c表示ac或bc;若通過轉(zhuǎn)義,即[ab]c就表示成了[ab]c。但是對(duì)于上述兩種不同的創(chuàng)建方法有不同的轉(zhuǎn)義方式。

首先,請(qǐng)記住在JavaScript中的元字符有 ( [ { ^ $ | ) ? * + . ] ) }。

使用字面量方法創(chuàng)建正則表達(dá)式轉(zhuǎn)義:在需要轉(zhuǎn)義的正則表達(dá)式前加即可。如var pattern = /[ab]c/g;表示在全局范圍內(nèi)匹配abc

使用RegExp構(gòu)造函數(shù)創(chuàng)建正則表達(dá)式轉(zhuǎn)義:在需要轉(zhuǎn)義的正則表達(dá)式前加。如var pattern = RegExp("[ab]c","g");同樣表示在全局范圍內(nèi)匹配abc

舉例:

如果希望知道字符串XxxxoOoooommmm中o的數(shù)量(不區(qū)分大小寫),這時(shí)就可以使用match方法傳入字符串,如:

var string = "XxxxoOoooommmm"; console.log(string.match(/o/ig).length);  

輸出為6,這種方法還是很容易的。

6.3 RegExp的實(shí)例屬性

無論是何種方法創(chuàng)建的正則表達(dá)式,他們都具有下面幾種屬性來描述有關(guān)模式的信息:

global---表示flags(標(biāo)志)中是否設(shè)置了g標(biāo)志。

ignoreCase---表示flags(標(biāo)志)中是否設(shè)置了i標(biāo)志。

lastIndex---表示開始搜索下一個(gè)匹配項(xiàng)的字符位置的整數(shù),從0算起。

multiple---表示flags(標(biāo)志)中是否設(shè)置了m標(biāo)志。

source---按照字面量形式返回正則表達(dá)式的字符串表示。

舉例如下所示:

// var pattern = RegExp("[ba]at","gi");//使用RegExp構(gòu)造函數(shù)創(chuàng)建得到的效果和下面使用的字面量方法創(chuàng)建得到的效果相同
var pattern = /[ba]at/gi;
console.log(pattern.global); //true
console.log(pattern.ignoreCase); //true
console.log(pattern.multiline);  //ture
console.log(pattern.lastIndex);  //0 
console.log(pattern.source);  //  [ba]at

當(dāng)然,上面代碼中使用了大量的console.log()顯得很復(fù)雜,也可以將這5個(gè)屬性作為5個(gè)參數(shù)直接傳入到console.log()中。如下所示:

var pattern = /[ba]at/gi;
console.log(pattern.global,pattern.ignoreCase,pattern.multiline,pattern.lastIndex,pattern.source); //true true false 0 "[ba]at"

我們還可以將這5個(gè)屬性保存在一個(gè)數(shù)組中,再通過console.log()直接輸出數(shù)組,如下所示:

var pattern = /[ba]at/gi;
var properties=[pattern.global,pattern.ignoreCase,pattern.multiline,pattern.lastIndex,pattern.source];
console.log(properties);
6.4 RegExp的實(shí)例方法

RegExp的實(shí)例主要有兩個(gè)方法exec()和test(),并且還有從Object繼承的toString()和toLocaleString()方法,下面將會(huì)逐一介紹。

6.4.1 RegExp實(shí)例的exec()方法

這個(gè)方法接收一個(gè)參數(shù),即要應(yīng)用模式的字符串,用于捕獲組。

如果匹配,則返回一個(gè)數(shù)組;否則返回null。

且其中返回的數(shù)組還有額外的兩個(gè)方法:index和input。index表示匹配項(xiàng)在字符串中的位置,input表示應(yīng)用正則表達(dá)式的字符串。

舉例如下所示:

var text="mom and dad and baby";
    var pattern=/mom( and dad( and baby)?)?/gi;
    var matches=pattern.exec(text);
    console.log(matches);

如果匹配不了,則matches為null;如果匹配,將會(huì)在控制臺(tái)中輸出一個(gè)數(shù)組

6.4.2 RegExp實(shí)例的test()方法

這個(gè)方法同樣也接收一個(gè)字符串,如果pattern(模式)和字符串匹配,則返回true,否則返回false。

并且test()方法經(jīng)常被用在if語(yǔ)句中,舉例如下:




    
    Regular Expression


    
    
    

6.4.3 RegExp實(shí)例的toString()和toLocalString()方法

這兩個(gè)方法都會(huì)返回正則表達(dá)式的字面量,與創(chuàng)建正則表達(dá)式的方式無關(guān)。
舉例如下:

var pattern=/1[358]d{9}/gi;
console.log(pattern.toString());
console.log(pattern.toLocaleString());
6.5 RegExp的構(gòu)造函數(shù)屬性

RegExp構(gòu)造函數(shù)也包含了一些屬性。值得注意的是,這些屬性有兩種方式來訪問---長(zhǎng)屬性名和短屬性名。介紹如下:

input $_ 最近一次要匹配的字符串 。(注意:前者是長(zhǎng)屬性名,后者是短屬性名,下同)

lastMatch $& 最近一次的匹配向。

lastParen $+ 最近一次匹配的捕獲組。

leftContext $` input字符串中l(wèi)astMatch之前的文本

RightContext $" input字符串中l(wèi)astMatch之后的文本

multiline $* 布爾值,表示是否所有表達(dá)式都使用多行模式

注意:Opera不支持上面的1236對(duì)應(yīng)的四個(gè)屬性,IE不支持multiline屬性。

舉例如下所示:

var text="this has been a short summer";
    var pattern=/(.)hort/g;
    if(pattern.test(text)){
        console.log(RegExp.input);//this has been a short summer
        console.log(RegExp.leftContext);//this has been a 
        console.log(RegExp.rightContext);//summer
        console.log(RegExp.lastParen);//s
        console.log(RegExp.lastMatch);//short
        console.log(RegExp.multiline);//undefined
    }
  • abc ?

  • a-z ?

  • 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97007.html

    相關(guān)文章

    • 正則達(dá)式多語(yǔ)操作指南

      摘要:能匹配中的,但不能匹配中的數(shù)量界定符符號(hào)定義是一個(gè)非負(fù)整數(shù)。則等價(jià)于和均為非負(fù)整數(shù),其中。該方法接受一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù)。是一個(gè)非強(qiáng)制異常類,它表示一個(gè)正則表達(dá)式模式中的語(yǔ)法錯(cuò)誤。 正則表達(dá)式及多語(yǔ)言操作指南 1. 正則表達(dá)式 正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)規(guī)則字符串,這個(gè)規(guī)則字符串用來表達(dá)對(duì)字符串的一...

      xzavier 評(píng)論0 收藏0
    • 編寫簡(jiǎn)單i18n庫(kù)

      摘要:因?yàn)閮纱蔚拈_發(fā)維護(hù)體驗(yàn)產(chǎn)生了對(duì)比,使我產(chǎn)生了不小的興趣假設(shè)一個(gè)簡(jiǎn)單的頁(yè)面需要多語(yǔ)言。兩個(gè)簡(jiǎn)單的區(qū)別就是和替換的區(qū)別。樣式模式其實(shí)就是簡(jiǎn)單的切換。當(dāng)修改的某個(gè)值時(shí),會(huì)觸發(fā)對(duì)應(yīng)的,并發(fā)射信號(hào)通知節(jié)點(diǎn)去更新。 i18n是什么?i18n(其來源是英文單詞internationalization的首末字符i和n,18為中間的字符數(shù))是國(guó)際化的簡(jiǎn)稱。 前言 第一次接觸多語(yǔ)言是用野生javascri...

      txgcwm 評(píng)論0 收藏0
    • 編寫簡(jiǎn)單i18n庫(kù)

      摘要:因?yàn)閮纱蔚拈_發(fā)維護(hù)體驗(yàn)產(chǎn)生了對(duì)比,使我產(chǎn)生了不小的興趣假設(shè)一個(gè)簡(jiǎn)單的頁(yè)面需要多語(yǔ)言。兩個(gè)簡(jiǎn)單的區(qū)別就是和替換的區(qū)別。樣式模式其實(shí)就是簡(jiǎn)單的切換。當(dāng)修改的某個(gè)值時(shí),會(huì)觸發(fā)對(duì)應(yīng)的,并發(fā)射信號(hào)通知節(jié)點(diǎn)去更新。 i18n是什么?i18n(其來源是英文單詞internationalization的首末字符i和n,18為中間的字符數(shù))是國(guó)際化的簡(jiǎn)稱。 前言 第一次接觸多語(yǔ)言是用野生javascri...

      DevWiki 評(píng)論0 收藏0
    • Chrome 插件特性實(shí)戰(zhàn)場(chǎng)景案例分析

      摘要:實(shí)現(xiàn)方案對(duì)頁(yè)面中涉及文案進(jìn)行修改,綁定多語(yǔ)言值。利用插件支持跨站請(qǐng)求的特性,向多語(yǔ)言平臺(tái)直接發(fā)送修改請(qǐng)求。異常處理利用插件可以獲取瀏覽器中特性,新開一個(gè)標(biāo)簽頁(yè)打開多語(yǔ)言后臺(tái),進(jìn)行登錄,登錄成功后就可以實(shí)現(xiàn)請(qǐng)求的授權(quán)修改了。 一、前言提起Chrome擴(kuò)展插件(Chrome Extension),每個(gè)人的瀏覽器中或...

      番茄西紅柿 評(píng)論0 收藏2637
    • Android-國(guó)際化(多語(yǔ))切換詳解實(shí)例

      摘要:國(guó)際化簡(jiǎn)稱因?yàn)樵诤椭g還有個(gè)字符,本地化,簡(jiǎn)稱。一鍵國(guó)際化如果需要很多語(yǔ)言的時(shí)候,手動(dòng)的切換很麻煩。二國(guó)際化實(shí)現(xiàn)實(shí)例配置資源文件,這個(gè)在前面已經(jīng)講過了。 internationalization(國(guó)際化)簡(jiǎn)稱 i18n,因?yàn)樵趇和n之間還有18個(gè)字符,localization(本地化),簡(jiǎn)稱L10n。 一.原理: Android中實(shí)現(xiàn)國(guó)際化相對(duì)來說還是簡(jiǎn)單的,因?yàn)锳ndroid有很獨(dú)特...

      jimhs 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    閱讀需要支付1元查看
    <