精华内容
下载资源
问答
  • 正则匹配否定模式, 匹配不存在xxx的内容 正则表达式 复合要求的正则表达式写法是这样, 匹配所有不含有nacos的内容, 下面分解下这个表达式每个字符代表的意思和效果 ^((?!nacos).)*$ ^((?!nacos).)*$ 这个$标识匹配...

    正则匹配否定模式, 匹配不存在xxx的内容

    正则表达式

    复合要求的正则表达式写法是这样, 匹配所有不含有nacos的内容, 下面分解下这个表达式每个字符代表的意思和效果

    ^((?!nacos).)*$
    

    ^((?!nacos).)*$

    这个$标识匹配这行

    没有$只是匹配符合要求之后的数据

    没有$

    $匹配整行

    带有$

    ^((?!nacos).)*$

    标识任意数量的字符

    展开全文
  • 正则匹配

    千次阅读 2013-08-06 09:54:27
    正则匹配模式 匹配模式指得是正则表达式引擎将以何种模式匹配字符串。 模式名称 启用,禁用 缺省启用 说明 UNIX_LINES (?d)启用,(?-d)禁用 是 启用Unix行模式。 在此模式下,只有 '\n'被认为...
    正则匹配模式
    匹配模式指得是正则表达式引擎将以何种模式匹配字符串。

    模式名称
    启用,禁用
    缺省启用
    说明
    UNIX_LINES
    (?d)启用,(?-d)禁用

    启用Unix行模式。
    在此模式下,只有 '\n'被认为是行结束符。它会影响.^, 和 $ 的行为。

    CASE_INSENSITIVE
    (?i)启用,(?-i)禁用

    启用忽略大小写模式。
    缺省时,忽略大小写模式只会影响 ASCII字符的匹配。 而Unicode范围的忽略大小写匹配需要通过 UNICODE_CASE 标志与本标志联合使用。
    启用此模式会影响匹配性能

    COMMENTS
    (?x)启用,(?-x)禁用

    允许空格和注释出现在正则表达式中。
    在此模式下,空格被忽略,以#开始的单行注释被忽略。 
    MULTILINE
    (?m)启用,(?-m)禁用

    启用多行模式。
    In multiline mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the input sequence. By default these expressions only match at the beginning and the end of the entire input sequence. 

    DOTALL
    (?s)启用,(?-s)禁用

    让.可以匹配行结束符。
    在此模式下,元字符.可以匹配行结束符。缺省不允许如此匹配。


    UNICODE_CASE
    (?u)启用,(?-u)禁用

    Enables Unicode-aware case folding.
    When this flag is specified then case-insensitive matching, when enabled by theCASE_INSENSITIVE flag, is done in a manner consistent with the Unicode Standard. By default, case-insensitive matching assumes that only characters in the US-ASCII charset are being matched. 启用此模式会影响性能。

    CANON_EQ
    (?c)启用,(?-c)禁用

    Enables canonical equivalence.
    When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "a\u030A", for example, will match the string"?" when this flag is specified. By default, matching does not take canonical equivalence into account. 
    启用此模式会影响性能。



    字符子集  字符子集可以含有别的字符子集,并且可以通过联合操作符(缺省)和交集操作符(&&)实现组合。联合操作符表示某个子集匹配它的子子集所匹配的任意字符。交集操作符表明某个字符子集只匹配它的子子集都匹配的字符。
      字符子集所能够有的操作符的优先级如下,从高到低:
    转义符\x
    成组符 [...]
    区间符 a-z
    联合符 [a-e][i-u]
    交集符 [a-z&&[aeiou]]
      注意:在字符子集[]内部的语法根本不同于正则表达式其它部分中的语法。例如,在字符子集内部,正则表达式 . 失去了它原有的含义,而是成了一个匹配.的元字符。 

    行结束符  行结束符是一个或两个字符序列,用以表明输入字符序列中一行的结束。下面的字符被认为是行结束符:
    一个换行符('\n')。
    一个回车符加上一个换行符("\r\n")。
    一个单独的回车符('\r')。
    代表下一行的字符('\u0085')。
    行分隔符('\u2028'),Unicode中被定义。
    一个分段符('\u2029),Unicode中被定义。
      如果 UNIX_LINES 模式被启用,则只有换行符被认为是行结束符。
      如果 MULTILINE 模式被启用,。

    分组和引用  字符分组以它们的左括号的出现顺序来排序。例如在表达式((A)(B(C))),有四个分组:
    ((A)(B(C)))
    (A)
    (B(C))
    (C)
      第0组永远表示表达式本身。
      分组采用这样的命名方式,是因为,在一次匹配过程中,正则表达式会被匹配多次。以前的匹配子序列有可能在将来被使用;或者在匹配结束时,程序有可能需要重新获得所有匹配的子字符序列。
      对于正则表达式中的某个分组而言,永远只保留最后匹配的字符序列。如果对某个分组匹配尝试失败,则会保留上次匹配成功的字符序列。例如,对于正则表达式(a(b)?)+而言,字符序列"aba",将会让分组2匹配的字符序列为"b"。
      以(?开始的分组,将不会计入分组数目,也不会被后续匹配所引用。

    Unicode支持  本正则表达式匹配引擎的实现遵循了《Unicode技术报告:Unicode正则表达式指南》,实现了该指南的第二层所需的功能,但是在细微处有一些简单语法修改。
      Unicode块(Block)和分类(Category)通过\p和\P通配苻表示。\p{prop}匹配含有prop的输入序列,而\P{prop}匹配不含有prop的输入序列。Unicode块通过前缀In表示,如\p{InMongolian}。Unicode分类通过可选的前缀Is表示,因此\p{L}和\p{IsL}都代表Unicode分类 letters。Unicode块和分类都可以在正则表达式子集外部和内部使用。
      目前支持的Unicode块和分类是《Unicode标准,第三版》中所指定的块和分类。 Unicode块名称在《Unicode 字符数据库》的第14章被定义,文件名称叫Blocks-3.txt,但是名称中的空格被去掉了。例如"Basic Latin"成了"BasicLatin"。无论是标准化的还是非标准化的分类,都在该标准的第88页的第4-5表中被全部定义。

    与Perl 5正则表达式语法对比 [TBD]

    正则表达式参考
    字符
    正则表达式字符串
    匹配的字符串
    X
    字符X,包括 CJK ExtB 区汉字
    \\
    反斜杠\
    \0n 八进制0n代表的字符(0<=n<=7)
    \0nn
    八进制0nn代表的字符(0<=n<=7)
    \0mnn
    八进制0mnn代表的字符(0<=m<=3,0<=n<=7)
    \xhh
    十六进制 0xhh所代表的字符
    \uhhhh
    十六进制 0xhhhh所代表的字符。注意,目前尚不支持CJK ExtB区汉字。
    \t
    制表符('\u0009')
    \n
    换行('\u000A')
    \r
    回车('\u000D')
    \a
    响铃符('\u0007')
    \e
    取消符Escape('\001B')
    \cx
    x所代表的控制字符

    逻辑操作符
    正则表达式字符串
    匹配的字符串
    XY
    X后面跟随Y
    X|Y
    X或者Y
    (X)
    X作为分组表达式

    向后引用
    正则表达式字符串
    匹配的字符串
    \n
    n个匹配的分组

    边界元字符
    边界字符
    匹配的字符串
    ^
    行首
    $
    行末
    \b 字符边界
    \B
    非字符边界
    \A
    输入流的开始
    \G
    上次匹配的结束处
    \Z
    输入流的结束,或者是最后一个行结束符,参见[url=file:///D:/source/jtextpro/src/dist/jtextpro/docs/regexp.html#man_line_terminator]行结束符[/url]。
    \z
    输入流的结束

    重复指示符
    正则表达式字符串
    匹配的字符串
    X?
    X重复一次,或者不重复
    X*
    X重复0次或多次
    X
    X重复1次或多次
    X{n}
    X重复n次,不多也不少。
    X{n,}
    X至少重复n次
    X{n,m}
    X至少重复n次,至多重复m次。
    注:X{n,m}、?、*、+方式可以联合使用。

    字符子集
    正则表达式字符串子集
    匹配的字符串
    组合方式
    [abc]
    字符a,b或c,包括 CJK ExtB 区汉字
    简单子集
    [^abc]
    任意非a,b或c的字符。
    排除
    [a-zA-Z] 从a到z,或者A到Z,包含a,z,A,Z。
    区间
    [a-d[m-p]]
    从a到d,或者m到p,等于[a-dm-p]。
    联合
    [a-z&&[def]]
    d,e或者f。
    交集
    [a-z&&[^bc]]
    从a到z,除了b和c,等于[ad-z]
    扣除
    [a-z&&[^m-p]]
    从a到z,并且不包括从m到p,等于[a-lq-z]
    扣除

    预定义子集(元字符)
    边界字符
    匹配的字符串
    .
    任意字符,可能匹配行结束符。
    \d
    数字[0-9]
    \D 非数字[^0-9]
    \s
    空白符[ \t\n\x0B\f\r]
    \S
    非空白符[^\s]
    \w
    单词符,包含有字母和数字[a-zA-Z_0-9]
    \W
    非单词符,不包含有字母和数字。

    扩展子集(元字符)
    正则表达式字符串
    匹配的字符串




    扩展中文子集(元字符)
    名称
    块名称(\p{InXXX})
    简化通配符
    标准Unicode块,或者汉字列表
    任意双字节字符(汉字或全角符号)
    \p{InQuqnJiao}
    \E
    任意由GBK表示的汉字,不包括GB18030扩展部分,
    以及CJK ExtB区的汉字。
    任意单字节字符
    \p{InFQuanJiao}
    \~E
    任意单字节字符。
    任意全角ASCII字符
    \p{InQJAscii}
    \H
    标准HalfwidthandFullwidthForms块
    任意收录在BIG5码集中的双字节字符
    \p{InBig5}
    \I
    Big5可编码双字节字符
    匹配未收录在BIG5码集中的双字节字符 \p{InFBig5}
    \~I
    非Big5可编码双字节字符
    匹配任意汉字(不包括符号)
    \p{InHanziOrCJKExtB}
    \X
    任意汉字,包括GB18030扩展部分。
    匹配任意汉字(不包括符号)
    \p{InHanzi}
    \M
    任意汉字,不包括GB18030扩展部分。
    匹配非汉字的双字节字符
    \p{InFHanzi}
    \~M
    任意非汉字的双字节字符,
    包括GB18030扩展部分。
    地支字符
    \p{InDiZhi}
    \U
    子丑寅卯辰巳午未申酉戌亥
    匹配收录在GB码集中的双字节字符
    \p{InGB}
    \g
    收录在GB码集中的双字节字符,
    不包括GB18030扩展部分。
    匹配非收录在GB码集中的双字节字符
    \p{InFGB}
    \~g
    未收录在GB码集中的双字节字符,
    不包括GB18030扩展部分。
    匹配收录在GBK码集中的双字节字符
    \p{InGBK}
    \h
    收录在GBK码集中的双字节字符,
    不包括GB18030扩展部分。
    匹配非收录在GBK码集中的双字节字符
    \p{InFGBK}
    \~h
    未收录在GBK码集中的双字节字符,
    不包括GB18030扩展部分。
    大写希腊字母
    \p{InDaXila}
    \K
    ΑΒΓΔΕΖΗΘΙΚΛΜΝ
    ΞΟΠΡΣΤΥΦΧΨΩ
    日文片假名
    \p{InPianJia}
    \j
    标准Katakana块
    日文平假名
    \p{InPingJia}
    \J
    标准Hiragana块
    小写希腊字母
    \p{InXiaoXila}
    \k
    αβγδεζηθικλμν
    ξοπρστυφχψω
    数学符号
    \p{InMathe}
    \m
    ±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙
    ∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴
    中文数字
    \p{InCnDigit}
    \i
    〇一二三四五六七八九十百千万亿兆吉京
    大写中文数字
    \p{InDaCnDigit}
    \N
    零壹贰叁肆伍陆柒捌玖拾佰仟萬亿兆吉京
    全角标点符号
    \p{InQJBiaoDian}
    \o
    、。·ˉˇ¨〃々—~‖…‘’“”〔〕
    〈〉《》「」『』〖〗【】!"'(),
    -.:;<=>?[]{|}`﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚
    ﹛﹜﹝﹞︵︶︹︺︿﹀︽︾﹁﹂﹃﹄
    ︻︼︷︸︱︳︴
    小写俄文字
    \p{InXiaoEWen}
    \l
    абвгдеёжзийклмн
    опрстуфхцчшщъыьэюя
    大写俄文字母
    \p{InDaEWen}
    \R
    АБВГДЕЁЖЗИЙКЛМНО
    ПРСТУФХЦЧШЩЪЫЬЭЮЯ
    中文序号
    \p{InCnSN}
    \q
    ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ
    ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ
    再加上Unicode标准EnclosedAlphanumerics块
    天干字符
    \p{InTianGan}
    \T
    甲乙丙丁戊己庚辛壬癸
    竖排标点符号
    \p{InSPBiaoDian}
    \V
    ︵︶︹︺︿﹀︽︾﹁﹂﹃﹄︻︼︷︸︱︳︴
    拼音字符
    \p{InPinyin}
    \y
    āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑńňɡ
    GBK -> 0xA8A1- 0xA8C0
    只是Unicode标准LatinExtended-A块的一部分。
    注音字符
    \p{InZhuyin}
    \Y
    标准Bopomofo块
    制表字符
    \p{InZhiBiao}
    \C
    标准BoxDrawing块。
    经检查发现 textpro 的算法含有部分非标
    准Unicode制表符:“∟∣≒≦≧⊿═”。

    POSIX字符子集(只适用于ASCII)
    正则表达式字符串
    匹配的字符串
    \p{Lower}
    小写字母[a-z]
    \p{Upper}
    大写字母[A-Z]
    \p{ASCII}
    所有的ASCII字符[\x00-\x7F]
    \p{Alpha}
    大小写字母[\p{Lower}\p{Upper}]
    \p{Digit}
    数字[0-9]
    \p{Alnum}
    字母数字符,包含大小写字母和数字[\p{Alpha}\p{Digit}]
    \p{Punct}
    标点符号,!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~之一。
    \p{Graph}
    可显示字符[\p{Alnum}\p{Punct}]
    \p{Print}
    可打印字符[\p{Graph}]
    \p{Blank}
    空格或者制表符[ \t]
    \p{Cntrl}
    控制字符[\x00-\x1F\x7F
    \p{XDigit}
    十六进制数字[0-9a-fA-F]
    \p{Space}
    空白符[ \t\n\x0B\f\r]

    Unicode块和分类

    中文名称(摘自Word XP)
    代码区域
    BasicLatin
    基本拉丁语
    \u0000-\u007F
    Latin-1Supplement
    拉丁语-1
    \u0080-\u00FF
    LatinExtended-A
    拉丁语扩充-A
    \u0100-\u017F
    LatinExtended-Bound
    拉丁语扩充-B
    \u0180-\u024F
    IPAExtensions
    国际音标扩充
    \u0250-\u02AF
    SpacingModifierLetters
    进格的修饰字符
    \u02B0-\u02FF
    CombiningDiacriticalMarks
    组合用发音符
    \u0300-\u036F
    Greek
    基本希腊语
    \u0370-\u03FF
    Cyrillic
    西里尔语
    \u0400-\u04FF
    Armenian

    \u0530-\u058F
    Hebrew

    \u0590-\u05FF
    Arabic

    \u0600-\u06FF
    Syriac

    \u0700-\u074F
    Thaana

    \u0780-\u07BF
    Devanagari

    \u0900-\u097F
    Bengali

    \u0980-\u09FF
    Gurmukhi

    \u0A00-\u0A7F
    Gujarati

    \u0A80-\u0AFF
    Oriya

    \u0B00-\u0B7F
    Tamil

    \u0B80-\u0BFF
    Telugu

    \u0C00-\u0C7F
    Kannada

    \u0C80-\u0CFF
    Malayalam

    \u0D00-\u0D7F
    Sinhala

    \u0D800-\uDFF
    Thai

    \u0E00-\u0E7F
    Lao

    \u0E80-\u0EFF
    Tibetan
    藏语
    \u0F00-\u0FFF
    Myanmar

    \u1000-\u109F
    Georgian

    \u10A0-\u10FF
    HangulJamo

    \u1100-\u11FF
    Ethiopic

    \u1200-\u137F
    Cherokee

    \u13A0-\u13FF
    UnifiedCanadianAboriginalSyllabics

    \u1400-\u167F
    Ogham

    \u1680-\u169F
    Runic

    \u16A0-\u16FF
    Khmer

    \u1780-\u17FF
    Mongolian
    蒙古语
    \u1800-\u18AF
    LatinExtendedAdditional

    \u1E00-\u1EFF
    GreekExtended

    \u1F00-\u1FFF
    GeneralPunctuation
    广义标点
    \u2000-\u206F
    SuperscriptsandSubscripts

    \u2070-\u209F
    CurrencySymbols
    货币符号
    \u20A0-\u20CF
    CombiningMarksforSymbols

    \u20D0-\u20FF
    LetterlikeSymbols
    类似字母的符号
    \u2100-\u214F
    NumberForms
    数字形式
    \u2150-\u218F
    Arrows
    箭头
    \u2190-\u21FF
    MathematicalOperators
    数学运算符
    \u2200-\u22FF
    MiscellaneousTechnical
    零杂技术用符号
    \u2300-\u23FF
    ControlPictures

    \u2400-\u243F
    OpticalCharacterRecognition

    \u2440-\u245F
    EnclosedAlphanumerics
    带括号的字母数字
    \u2460-\u24FF
    BoxDrawing
    制表符
    \u2500-\u257F
    BlockElements
    方块图形
    \u2580-\u259F
    GeometricShapes
    几何图形
    \u25A0-\u25FF
    MiscellaneousSymbols
    零杂丁贝符(示意符等)
    \u2600-\u26FF
    Dingbats

    \u2700-\u27BF
    BraillePatterns

    \u2800-\u28FF
    CJKRadicalsSupplement

    \u2E80-\u2EFF
    KangxiRadicals

    \u2F00-\u2FDF
    IdeographicDescriptionCharacters

    \u2FF0-\u2FFF
    CJKSymbolsandPunctuation
    CJK符号和标点
    \u3000-\u303F
    Hiragana
    平假名
    \u3040-\u309F
    Katakana
    片假名
    \u30A0-\u30FF
    Bopomofo
    注音
    \u3100-\u312F
    HangulCompatibilityJamo

    \u3130-\u318F
    Kanbun

    \u3190-\u319F
    BopomofoExtended
    扩展注音
    \u31A0-\u31BF
    EnclosedCJKLettersandMonths
    带括号的CJK字母及月份
    \u3200-\u32FF
    CJKCompatibility
    CJK兼容字符
    \u3300-\u33FF 
    CJKUnifiedIdeographsExtensionA
    CJK统一汉字扩展-A
    \u3400-\u4dBF
    CJKUnifiedIdeographs
    CJK统一汉字
    \u4E00-\u9fAF
    YiSyllables

    \uA000-\uA48F
    YiRadicals

    \uA490-\uA4CF
    HangulSyllables

    \uAC00-\uD7A3
    HighSurrogates

    \uD800-\uDB7F
    HighPrivateUseSurrogates

    \uDB80-\uDBFF
    LowSurrogates

    \uDC00-\uDFFF
    PrivateUse
    专用区
    \uE000-\uF8FF
    CJKCompatibilityIdeographs
    CJK兼容汉字
    \uF900-\uFAFF
    AlphabeticPresentationForms

    \uFB00-\uFB4F
    ArabicPresentationForms-A

    \uFB50-\uFDFF
    CombiningHalfMarks

    \uFE20-\uFE2F
    CJKCompatibilityForms
    CJK兼容形式
    \uFE30-\uFE4F
    SmallFormVariants
    小写变体
    \uFE50-\uFE6F
    ArabicPresentationForms-Bound

    \uFE70-\ufeFF
    Specials

    \uFFF0-\uFFFF
    HalfwidthandFullwidthForms
    半形及全形字符
    \uFF00-\uFFEF


    分类
    全称
    说明
    Cn

    UNASSIGNED
    Lu

    UPPERCASE_LETTER
    Ll

    LOWERCASE_LETTER
    Lt

    TITLECASE_LETTER
    Lm

    MODIFIER_LETTER
    Lo

    OTHER_LETTER
    Mn

    NON_SPACING_MARK
    Me

    ENCLOSING_MARK
    Mc

    COMBINING_SPACING_MARK
    Nd

    DECIMAL_DIGIT_NUMBER
    Nl

    LETTER_NUMBER
    No

    OTHER_NUMBER
    Zs

    SPACE_SEPARATOR
    Zl

    LINE_SEPARATOR
    Zp

    PARAGRAPH_SEPARATOR
    Cc

    CNTRL
    Cf

    FORMAT
    Co

    PRIVATE_USE
    Cs

    SURROGATE
    Pd

    DASH_PUNCTUATION
    Ps

    START_PUNCTUATION
    Pe

    END_PUNCTUATION
    Pc

    CONNECTOR_PUNCTUATION
    Po

    OTHER_PUNCTUATION
    Sm

    MATH_SYMBOL
    Sc

    CURRENCY_SYMBOL
    Sk

    MODIFIER_SYMBOL
    So

    OTHER_SYMBOL
    L

    LETTER
    M

    MARK
    N

    NUMBER
    Z

    SEPARATOR
    C

    CONTROL
    P

    PUNCTUATION
    S

    SYMBOL
    LD

    LETTER_OR_DIGIT
    L1

    Latin-1
    all

    ALL
    ASCII

    ASCII
    Alnum

    字母数字(0-9,a-z,A-Z)
    Alpha

    字母(a-z,A-Z)
    Blank

    空格和制表符(' '|\t)
    Cntrl

    控制字符,不可打印
    Digit

    数字(0-9)
    Graph

    可打印且可视字母(例如空格' '是可打印的但不是可视字母,而 `a' 两者都是。)
    Lower

    小写字母
    Print

    可打印字母(非控制字符)
    Punct

    标符号(字母、数字、控制、空白符以外的字母),如:!@#$%}{<>,./?[]等等。
    Space

    空白符(' ',\t,0x09,0x0A,0x0B,0x0C,0x0D,0x20)
    Upper

    大写字母
    XDigit

    十六进制数字(0-9,a-f, A-F)




    替换表达式特殊字符
    特殊字符介绍
    描述
    \n
    换行
    \b
    向前删除一个字符。当这个字符位于替换串之首时,将删除匹配串之前的一个字符。若匹配串位于行首,将使匹配串所在行与前一行相合并。
    \d
    向后删除一个字符。当这个字符位于替换串之末时,将删除匹配串之后的一个字符。若匹配串位于行末,将使匹配串所在行与下一行相合并。
    \e
    插入一个ESC字符
    \t
    插入一个TAB字符
    \n
    n代表查找正则表达式中的子表达式(组)。\1代表第一个子表达式,\2代表第二个子表达式,依次类推。\0代表整个匹配到的字符串。
    \v
    大写下一个字母
    \U
    全部大写以后的字母,直到碰到其它指示符为止。
    \l
    小写下一个字母
    \L
    全部小写以后的字母,直到碰到其它指示符为止。
    \E
    取消所有的字母大小写指示符。


    自定义替换表

    在查找/替换中使用自定义替换表 
    有的时候,上述简单的自定义替换功能是不够的。例如,用户可能希望只把出现在括号内的源串替换为目标串。这种文本处理可以通过在查找/替换中使用自定义替换表来解决。 

    在查找/替换功能中使用自定义替换表的替换函数是\Tn,其中n是0-9的数字, 注意n为0表示第10张替换表。如果略去n,其效果相当于\T1,即使用第一张替换表。例如要把所有放在方括号中的汉字替换为拼音,可以查找“\[(\E)\]”,替换为“\T{\1}”。即把第一个子表达式的匹配内容按自定义替换表转换。注意,如果\T函数的参数不在替换表的源串中,\T函数的结果与源串相同,即不做任何变换。 

    有些情况下,用户可能希望只使用替换表的一部分内容。还是以拼音为例,前面给出的替换表中包含了拼音的音调,如果在替换时不希望加上这些音调数字,可以使用“过滤”功能。所谓过滤,其实是用一个正则表达式去分析替换表的目标串,并把其中的某个子表达式取出来。 

    使用“过滤”时,在“设置自定义替换表”对话框中,点“过滤”按钮,在弹出的对话框中填入一个正则表达式。再以拼音为例,表达式可以写为“(\p{Alpha}+)(\d)”,其中第一对括号中的是不含音调的拼音,第二对括号是音调。在调用\T函数时,JTextPro会在目标串中查找这个正则表达式。但是如何把其中的子表达式取出来呢?\T函数还有一个可选的下标,取第n个子表达式的值就写作\T{...}[n]。所以,把放在方括号中的汉字替换为不带调的拼音,可以查找“\[(\E)\]”,替换为“\T{\1}[1]” 



    匹配汉字:

    Regex r= new Regex(@"[\u4e00-\u9fa5]+");
    MatchCollection m=r.Match(yourstring);

    -------------------------
    如果需要使用正则表达式匹配Unicode字符的话... 
    这里是几个主要非英文语系字符范围(google上找到的):

    2E80~33FFh:中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符,中日韩的符号、标点、带圈或带括符文数字、月份,以及日本的假名组合、单位、年号、月份、日期、时间等。

    3400~4DFFh:中日韩认同表意文字扩充A区,总计收容6,582个中日韩汉字。

    4E00~9FFFh:中日韩认同表意文字区,总计收容20,902个中日韩汉字。

    A000~A4FFh:彝族文字区,收容中国南方彝族文字和字根。

    AC00~D7FFh:韩文拼音组合字区,收容以韩文音符拼成的文字。

    F900~FAFFh:中日韩兼容表意文字区,总计收容302个中日韩汉字。

    FB00~FFFDh:文字表现形式区,收容组合拉丁文字、希伯来文、阿拉伯文、中日韩直式标点、小符号、半角符号、全角符号等。

    比如需要匹配所有中日韩非符号字符,那么正则表达式应该是^[\u3400-\u9FFF]+$
    理论上没错, 可是我到msn.co.ko随便复制了个韩文下来, 发现根本不对, 诡异
    再到msn.co.jp复制了个'お', 也不得行..
    展开全文
  • .NET正则匹配模式

    千次阅读 2013-03-22 10:19:41
    匹配模式指的是一些可以改变正则表达式匹配行为的选项或修饰符。不同的语言支持的匹配模式不同,使用的方式也不同。 一般可分为全局和内联两种。下面主要介绍.NET中的匹配模式,其它语言的匹配模式,后续视情况补充...

    1        概述

    匹配模式指的是一些可以改变正则表达式匹配行为的选项或修饰符。不同的语言支持的匹配模式不同,使用的方式也不同。

    一般可分为全局和内联两种。下面主要介绍.NET中的匹配模式,其它语言的匹配模式,后续视情况补充。

    2        匹配模式

    2.1     全局匹配模式和内联匹配模式概述

    .NET中的全局匹配模式是通过RegexOptions 枚举值指定的,可以按位“或”进行组合,全局匹配模式只能作用于整个正则表达式。全局匹配模式提供的模式更多,可以灵活的动态指定匹配模式。

    而内联匹配模式是通过在正则表达式中,使用(?imnsx-imnsx:)(?imnsx-imnsx)的分组构造来改变正则表达式的匹配行为的。内联匹配模式更灵活、简洁,但是提供的模式较少。

    下表摘自MSDN,部分说明做了修改。

    RegexOption 成员

    内联字符

    说明

    None

    N/A

    指定不设置任何选项。

    IgnoreCase

    i

    指定不区分大小写的匹配。

    Multiline

    m

    指定多行模式。更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。

    ExplicitCapture

    n

    指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:…)导致的语法上的笨拙。

    Compiled

    N/A

    指定正则表达式将被编译为程序集。生成该正则表达式的Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。

    Singleline

    s

    指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。

    IgnorePatternWhitespace

    x

    指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。请注意,空白永远不会从字符类中消除。

    RightToLeft

    N/A

    指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。

    ECMAScript

    N/A

    指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可与 IgnoreCase 和 Multiline 标志一起使用。将ECMAScript 同任何其他标志一起使用将导致异常。

    CultureInvariant

    N/A

    指定忽略语言中的区域性差异。

    2.2     全局匹配模式

    下面根据各种模式使用的频率进行讲解。

    2.2.1  IgnoreCase 忽略大小写

    几乎所有支持正则的语言中都提供了这一模式,是应用最多的模式之一,同时也是被“滥”用最多的模式之一。

    开启忽略大小写模式,则字符可以同时匹配大写或小写形式。比如在此模式下,正则表达式“<br>”可同时匹配“<br>”和“<BR>

    但并不是所有的字符都有大小写形式,所以在书写的正则中,如果不存在可区分大小写形式的元字符或是字符序列时,开启这一模式是没有任何意义的。

    比如替换一般的html标签的正则表达式

    string result = Regex.Replace(srcStr, @"<[^>]*>", "", RegexOptions.IgnoreCase);

    因为<[^>]*>没有哪一个元字符或是字符序列具有大小写形式,所以这里的RegexOptions.IgnoreCase是多余的,用在这里虽然不会改变匹配结果,但是会降低匹配效率,同时这也不是一个好的习惯。

    只有在正则表达式中,注意是正则表达式中,而不是待匹配的源字符串中,涉及到大小写形式的元字符或是字符序列时,才使用IgnoreCase模式。

    2.2.2  Multiline 多行模式

    多行模式改变的是“^”和“$”的匹配行为,使“^”和“$”不仅可以匹配整个字符串的开始和结束位置,还可以匹配每行的开始和结束位置。

    首先说明一下“行”的范围。虽然我们在程序中习惯用“\r\n”来表示换行,但实际上“\r”和“\n”是不相关的两个字符,一个表示回车,一个表示换行。由于历史原因,“\r”并不是所有系统都支持的,所以“行”是由“\n”来分割的,其中“\n”属于前一“行”,而不属于后一“行”。

    举例来说,字符串“a\r\nbc\r\n”共有三行,“a\r\n”为一行,“bc\r\n”为一行,最后还有一个“”空行。

    2.2.2.1  在不开启多行模式情况下,“^”和“$”匹配范围

    ^”的匹配范围

    MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"^");

    foreach (Match m in mc)

    {

         richTextBox2.Text += "匹配内容:" + m.Value + "  匹配开始索引:" + m.Index + "  匹配长度:"+ m.Length + "\n";

    }

    /*--------输出--------

    匹配内容:  匹配开始索引:0  匹配长度:0

    */

    $”的匹配范围

    MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"$");

    foreach (Match m in mc)

    {

         richTextBox2.Text += "匹配内容:" + m.Value + "  匹配开始索引:" + m.Index + "  匹配长度:"+ m.Length + "\n";

    }

    /*--------输出--------

    匹配内容:  匹配开始索引:6  匹配长度:0

    匹配内容:  匹配开始索引:7  匹配长度:0

    */

    注意:这里需要注意的是,在没有开启多行模式时,字符串结尾如果是“\n”,那么“$”是可以匹配两个位置的,一个是“\n”前的位置,一个是字符串结束位置。字符串结尾如果不是“\n”,那么“$”就只匹配字符串结束位置。

    MatchCollection mc = Regex.Matches("a\r\nbc\r", @"$");

    foreach (Match m in mc)

    {

         richTextBox2.Text += "匹配内容:" + m.Value + "  匹配开始索引:" + m.Index + "  匹配长度:"+ m.Length + "\n";

    }

    /*--------输出--------

    匹配内容:  匹配开始索引:6  匹配长度:0

    */

    2.2.2.2  在开启了多行模式后,“^”和“$”匹配范围

    ^”的匹配范围

    MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"^", RegexOptions.Multiline);

    foreach (Match m in mc)

    {

         richTextBox2.Text += "匹配内容:" + m.Value + "  匹配开始索引:" + m.Index + "  匹配长度:"+ m.Length + "\n";

    }

    /*--------输出--------

    匹配内容:  匹配开始索引:0  匹配长度:0

    匹配内容:  匹配开始索引:3  匹配长度:0

    匹配内容:  匹配开始索引:7  匹配长度:0

    */

    $”的匹配范围

    MatchCollection mc = Regex.Matches("a\r\nbc\r\n", @"$", RegexOptions.Multiline);

    foreach (Match m in mc)

    {

         richTextBox2.Text += "匹配内容:" + m.Value + "  匹配开始索引:" + m.Index + "  匹配长度:"+ m.Length + "\n";

    }

    /*--------输出--------

    匹配内容:  匹配开始索引:2  匹配长度:0

    匹配内容:  匹配开始索引:6  匹配长度:0

    匹配内容:  匹配开始索引:7  匹配长度:0

    */

    2.2.2.3  匹配结果分析

    ^”匹配结果分析

    在不开启多行模式时,“^”只匹配字符串的开始位置,也就是位置0

    在开启了多行模式后,“^”匹配字符串开始位置和每个“\n”之后的行起始位置。

    $”匹配结果分析

    在不开启多行模式时,如果字符结尾是“\n”,那么“$”会匹配结尾“\n”之前和结束两个位置。

    在开启多行模式后,“$”匹配每行“\n”之前的位置和字符串结束位置。

    需要注意的是,在.NET中,无论是否开启多行模式,“^”和“$”匹配的都只是一个位置,是零宽度的。其它语言中“^”和“$”的意义可能会有所不同。

    只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。

    2.2.2.4  应用举例

    典型应用一(参考 正则中加字符的问题):

    需求描述:

    fffffffffff

    fffffffffff

    dfdfdfdf

    erererere

    ferewfdfds

    每行后面加一个“ttt”,即为

    fffffffffffttt

    fffffffffffttt

    dfdfdfdfttt

    ererererettt

    ferewfdfdsttt

    代码实现:

    string result = Regex.Replace(yourStr, @"^.*$", "$0ttt", RegexOptions.Multiline);

     

    典型应用二

    需求描述:

    源字符串

    CODE39/CODE93:

    A-Z

    space,-,.,$,/,+,%

     

    CODE128A:

    A-Z

    0-9

    space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_

     

    CODE128B:

    A-Z

    a-z

    0-9

    space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_,{,},|,~

     

    CODE2of5:

    0-9

     

    说明:

    CODE128A:->条码类别

    A-Z

    0-9

    space,!,",#,$,%,&,…,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_->表示范围

    要求分别匹配出条码类别和表示范围

    代码实现:

    MatchCollection mc = Regex.Matches(yourStr, @"(?<type>[^\n:]+):\s*(?<range>(^(?!\s*$).*$\n?)*)",RegexOptions.Multiline);

    foreach (Match m in mc)

    {

         richTextBox2.Text += "条码类别: \n" + m.Groups["type"].Value + "\n";

         richTextBox2.Text += "表示范围: \n" + m.Groups["range"].Value + "\n";

    }

    /*--------输出--------

    条码类别:

    CODE39/CODE93

    表示范围:

    A-Z

    space,-,.,$,/,+,%

     

    条码类别:

    CODE128A

    表示范围:

    A-Z

    0-9

    space,!,",#,$,%,&,,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_

     

    条码类别:

    CODE128B

    表示范围:

    A-Z

    a-z

    0-9

    space,!,",#,$,%,&,,(,)*,+,逗号,-,.,/, <,=,>,?,@,[,],^,_,{,},|,~

     

    条码类别:

    CODE2of5

    表示范围:

    0-9

    */

    2.2.3   Singleline 单行模式

    单行模式改变的是小数点“.”的匹配行为,使小数点可以匹配包含换行符“\n”在内的任意一个字符。

    这是一个很不幸的命名,总让人误会它与Multiline多行模式是有关联的,而事实上它改变的是小数点的匹配行为,与Multiline多行模式没有任何关联,由于历史原因,这一不幸的命名被保留了下来。使用时需要注意。

    单行模式通常在匹配有换行的文本时使用,采用小数点+单行模式的方式匹配任意字符,在.NET中是效率最高的。参考 正则基础之——小数点

    典型应用:

    源字符串:

    <a>There is one obvious advantage:</a>

    <div>

        <p>

            You've seen it coming!<br/>

            Buy now and get nothing for free!<br/>

            Well, at least no free beer. Perhaps a bear,<br/>

            if you can afford it.

        </p>

    </div>

    <a>Now that you've got...</a>

    <div>

        <p>

            your bear, you have to admit it!<br/>

            No, we aren't selling bears.

        </p>

    </div>

    需求:取<div>标签之间的内容

    代码实现:

    MatchCollection mc = Regex.Matches(yourStr, @"<div[^>]*>(?:(?!</div\b).)*</div>",RegexOptions.Singleline|RegexOptions.IgnoreCase);

    foreach (Match m in mc)

    {

         richTextBox2.Text += m.Value + "\n-------------------\n";

    }

    /*--------输出--------

    <div>

        <p>

            You've seen it coming!<br/>

            Buy now and get nothing for free!<br/>

            Well, at least no free beer. Perhaps a bear,<br/>

            if you can afford it.

        </p>

    </div>

    -------------------

    <div>

        <p>

            your bear, you have to admit it!<br/>

            No, we aren't selling bears.

        </p>

    </div>

    -------------------

    */

    2.2.4   Compiled 编译模式

    Compiled改变的是.NET中正则表达式的编译方式。启用了Compiled模式,会延长启动时间,占用更多的内存,会提高匹配速度。当然,对最终性能的影响,需要根据具体问题综合考虑的。这一模式也是被“滥”用最多的模式之一。

    程序运行过程中,第一次遇到正则表达式,需要加载正则引擎,对正则表达式进行必要的语法检查,并做适当的优化,最后把它转换为适合正则引擎应用的形式。这种“解析”过程,对于复杂的正则表达式,频繁调用或是匹配较大的数据源时,对效率的影响较大。

    这时可以在构建正则表达式时开启Compiled模式。这样做会将正则表达式直接编译为MSIL代码,在正则匹配过程中,可以由JIT优化为更快的本地机器代码,获得更高的匹配速度。但这种方式会降低正则的解析速度,占用更多的内存,而且它占用的内存在程序运行过程中会一直占用,无法释放。

    什么场景下使用Compiled模式,需要根据实际情况具体问题具体分析,一般来说,以下场景不适合使用Compiled模式:

    1.         对匹配效率没有要求的场景;

    2.         非常简单的正则表达式;

    3.         极少调用的方法中声明的正则表达式;

    4.         循环体中声明的正则表达式(除了动态生成的正则表达式,否则不要在循环体内声明正则表达式);

    5.         静态方法中声明的正则表达式(静态方法每次调用都需要重新编辑正则表达式,使用Compiled模式只会降低效率)。

    2.2.5   RightToLeft 从右到左模式

    RightToLeft改变的是正则表达式匹配的顺序,从右到左进行匹配。目前只有.NET支持这一模式,但它对这一模式的支持并不是很完善,有时容易让人费解,所以除非对源字符串的构成很了解,而且又不得不使用的情况,否则不要轻易使用这一模式。

    典型应用(参考 求一个好的算法):

    一个由字母组成的字符串,最长14位,要求每隔2位加一个逗号,最左边不加,求一个好的算法

    例:“abcdefg”    返回“a,bc,de,fg”

    代码实现:

    string test = "abcdefg";

    string result = Regex.Replace(yourStr, @"(?<!^)[a-zA-Z]{2}", ",$0", RegexOptions.RightToLeft);

    2.2.6   None

    这一模式指定不开启任何模式。在.NETRegexOptions 枚举值是按位组合,None模式我目前只找到一种应用场景,就是在动态生成正则表达式时,动态指定模式时使用。

    /// <summary>

    /// 动态生成正则参数列表

    /// </summary>

    /// <returns></returns>

    private RegexOptions getParameter()

    {

        RegexOptions roList = RegexOptions.None;

        if (cbIgnoreCase.Checked)

        {

             roList = roList | RegexOptions.IgnoreCase;

         }

     

         if (cbSingleline.Checked)

         {

              roList = roList | RegexOptions.Singleline;

         }

         if (cbMultiline.Checked)

         {

              roList = roList | RegexOptions.Multiline;

         }

         if (cbCompiled.Checked)

         {

              roList = roList | RegexOptions.Compiled;

         }

         if (cbRightToLelft.Checked)

         {

              roList = roList | RegexOptions.RightToLeft;

         }

         return roList;

    }

    2.2.7   ExplicitCapture

    这一模式改变的是普通捕获组的匹配行为。将普通捕获组解释为非捕获组,只有显式命名的命名捕获组才当作捕获组使用。

    捕获组的作用是将括号()内子表达式匹配到的内容保存到内存中一个组里,供以后引用,在.NET中捕获组有两种形式

    (Expression) 普通捕获组

    (?<name>Expression) 命名捕获组

    其它形式的(?...)都不是捕获组。

    但是(Expression)这种捕获组语法规则也带来一个副作用,在一些不得不使用()的场合,会默认为使用了捕获组,将匹配到的内容保存到内存中,而有些情况下这些内容并不需要关心的,浪费了系统资源,降低了匹配效率,所以才有了非捕获组(?:Expression)的出现,来抵消这一副作用。而非捕获组带来的另一个副作用的就是可读性的降低。

    ExplicitCapture模式是为了在不牺牲匹配效率的前提下,提高正则表达式的可读性,一般在命名捕获组和普通捕获组混合出现,而又不关心普通捕获组的正则表达式中使用,如取链接和文字的正则表达式中

    MatchCollection mc = Regex.Matches(yourStr, @"(?is)<a((?!href=).)*href=(?<s>['""]?)(?<url>[^""'\s>]*)\k<s>[^>]*>(?<text>((?!</a>).)*)</a>", RegexOptions.ExplicitCapture);

    foreach (Match m in mc)

    {

          richTextBox2.Text += m.Groups["url"].Value + "\n";

         richTextBox2.Text += m.Groups["text"].Value + "\n";

    }

    开启ExplicitCapture模式对正则表达式解释行为的影响,可以参考如下举例,匹配时间的正则表达式

    未开启ExplicitCapture模式

    string test = "<li title=\"截至2009-07-28 20:45:49,用户的总技术分为:5988;截至2009-07-26日,用户的总技术分排名为:4133\">(...)</li>";

    Regex reg = new Regex(@"([01][0-9]|2[0-3])(:[0-5][0-9]){2}");

    MatchCollection mc = reg.Matches(test);

    foreach (Match m in mc)

    {

         richTextBox2.Text += m.Value + "\n";

         richTextBox2.Text += m.Groups[1].Value + "\n";

         richTextBox2.Text += m.Groups[2].Value + "\n";

    }

    /*--------输出--------

    20:45:49

    20

    :49

    */

    开启ExplicitCapture模式

    string test = "<li title=\"截至2009-07-28 20:45:49,用户的总技术分为:5988;截至2009-07-26日,用户的总技术分排名为:4133\">(...)</li>";

    Regex reg = new Regex(@"([01][0-9]|2[0-3])(:[0-5][0-9]){2}");

    MatchCollection mc = reg.Matches(test);

    foreach (Match m in mc)

    {

         richTextBox2.Text += m.Value + "\n";

         richTextBox2.Text += m.Groups[1].Value + "\n";

         richTextBox2.Text += m.Groups[2].Value + "\n";

    }

    /*--------输出--------

    20:45:49

    */

    一般来说,关心的只是整个正则表达式匹配的整体,启用了ExplicitCapture模式后,“([01][0-9]|2[0-3])”和“(:[0-5][0-9])”将不会被解释为捕获组,匹配到的内容也不会保存到内存中。

    开启ExplicitCapture模式虽然可以提高正则表达式的可读性,但ExplicitCapture这一模式本身容易被人忽略,所以这种模式应用得也比较少。

    一旦使用了ExplicitCapture模式,要注意的是,除非你清楚捕获组的编号规则,否则尽量不要再使用\number方式进行反向引用,可以使用\k<name>方式进行反向引用。

    Regex reg = new Regex(@"href=(['""]?)(?<url>[^'""\s>]+)\1", RegexOptions.ExplicitCapture);

    MatchCollection mc = reg.Matches(yourStr);

    foreach (Match m in mc)

    {

         richTextBox2.Text += m.Value + "\n";

    }

    以上匹配链接的代码通常是得不到任何结果的,因为这里“\1”引用的内容,不再是“(['""]?)”匹配到的内容,而是“(?<url>[^'""\s>]+)”匹配到的内容,等价于“(?<url>[^'""\s>]+)\k<url>”,而这样的字符串,通常是不存在的。

    2.2.8   IgnorePatternWhitespace

    这一模式忽略正则表达式中的非转义空白字符,并启用“#”后面的注释,通常用于增强正则表达式的可读性或是用于教学目的。

    举个例子基本上就会明白了

    string test = "(One) and ( Two (Three) Four).";

    Regex reg = new Regex(@"\(                          #普通开括弧

                              (?>                       #固化分组

                                 \(   (?<OPEN>)         #遇到开括弧'OPEN'计数加1

                                |                       #分支结构

                                 \)   (?<-OPEN>)        #遇到闭括弧'OPEN'计数减1

                                |                       #分支结构

                                 [^()]+                 #非括弧的其它任意字符

                              )*                        #以上子串出现0次或任意多次

                              (?(OPEN)(?!))             #判断是否还有'OPEN',有则说明不配对,什么都不匹配

                            \)                          #普通闭括弧

                           ", RegexOptions.IgnorePatternWhitespace);

    MatchCollection mc = reg.Matches(test);

    foreach (Match m in mc)

    {

          richTextBox2.Text += m.Value + "\n";

    }

    其中的空白字符被忽略,“#”及该行后面的内容被解释为注释。

    2.2.9   ECMAScript

    这一模式将按ECMAJavaScript语义来解析正则表达式。通常影响的是以下元字符的匹配行为

    \w\W\d\D\s\S

    使得以上元字符只能匹配ASCII码字符,而不再是匹配相应的Unicode字符。

    事实上比如需求中明确要求只匹配英文字母,数字,下划线,而不包含汉字等字符,那么完全可以用“[A-Za-z0-9_]”,而不使用“\w”,虽然不够简洁,但可读性更好,语义更明确。

    这一模式在.NET中的应用比较少,如不清楚什么场景下应该使用,可以忽略这一模式。

    2.2.10               CultureInvariant

    这一模式指定忽略语言中的区域性差异。一般与IgnoreCase模式一起使用,这一模式的应用场景很少,一般可以忽略,无需了解。

    2.3     内联匹配模式

    内联匹配模式在正则表达式内部使用,可以改变局部子表达式的匹配行为,内联匹配模式支持的模式较少,仅有immsx五种,但使用起来更简洁,更灵活。在.NET中支持(?imnsx-imnsx:)(?imnsx-imnsx)两种形式。

    各内联匹配模式对应的全局匹配模式见匹配模式列表。以下仅就(?i)忽略大小写模式进行讲解,其它模式类同。

    2.3.1  (?imnsx-imnsx:)形式

    语法:(?i:Expression)

    这种语法规则表达为括号内的子表达式开启忽略大小写模式。

    举例:^[A-Z](?i:[A-Z]{9,19})$

    以上正则表示,首字符必须为大写字母,后面跟919个大小写字母。

    string[] test = new string[] { "Abc", "AbcdefGHIjklmn", "abcdefghijklmn" };

    Regex reg = new Regex(@"^[A-Z](?i:[A-Z]{9,19})$");

    foreach (string s in test)

    {

         richTextBox2.Text += "源字符串: " + s.PadRight(15, ' ') + "  匹配结果: " + reg.IsMatch(s) + "\n";

    }

    /*--------输出--------

    源字符串: Abc              匹配结果: False

    源字符串: AbcdefGHIjklmn   匹配结果: True

    源字符串: abcdefghijklmn   匹配结果: False

    */

    语法:(?-i:Expression)

    这种语法规则表达为括号内的子表达式关闭忽略大小写模式。通常与全局匹配模式配合使用,表示全局为忽略大小写的,局部为严格区分大小写。

    举例:<div id="(?-i:TEST)" [^>]*>[\w\s]+</div>

    以上正则表示,div标签中,仅匹配id为全大写的“TEST”的标签内容,其余标签不匹配。

    string test = "<DIV id=\"Test\" class=\"create\">first</div> and <DIV id=\"TEST\" class=\"delete\">second</div>";

    Regex reg = new Regex(@"<div id=""(?-i:TEST)""[^>]*>[\w\s]+</div>", RegexOptions.IgnoreCase);

    MatchCollection mc = reg.Matches(test);

    foreach(Match m in mc)

    {

          richTextBox2.Text += m.Value + "\n";

    }

    /*--------输出--------

    <DIV id="TEST" class="delete">second</div>

    */

    2.3.2  (?imnsx-imnsx)

    语法:(?i) 或 (?-i)

    (?i)为所在位置右侧的子表达式开启忽略大小写模式,直到出现(?-i)或者到表达式结束为止;(?-i)为所在位置右侧的子表达式关闭忽略大小写模式,直到出现(?i)或者到表达式结束为止。

    通常在正则表达式开始位置使用(?i)来代替RegexOptions.IgnoreCase,使代码更简洁。如提取链接和文字的正则表达式

    MatchCollection mc = Regex.Matches(yourStr, @"(?is)<a(?:(?!href=).)*href=(['""]?)(?<url>[^""'\s>]*)\1[^>]*>(?<text>(?:(?!</a>).)*)</a>");

    foreach (Match m in mc)

    {

          richTextBox2.Text += m.Groups["url"].Value + "\n";

          richTextBox2.Text += m.Groups["text"].Value + "\n";

    }

    3       小结

    .NET中的正则匹配模式基本上已讲解完了,最后再来总结一下各匹配模式的应用场景吧。

    RegexOption 成员

    内联字符

    作用/应用场景

    None

    N/A

    指定不设置任何选项。

    一般在动态指定匹配模式时使用。

    IgnoreCase

    i

    指定不区分大小写的匹配。

    只有在正则表达式中,注意是正则表达式中,而不是待匹配的源字符串中,涉及到大小写形式的元字符或是字符序列时,才使用IgnoreCase模式。

    Multiline

    m

    指定多行模式。更改 ^  $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。

    只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。

    ExplicitCapture

    n

    指定唯一有效的捕获是显式命名或编号的 (?<name>…) 形式的组。这允许圆括号充当非捕获组,从而避免了由 (?:…)导致的语法上的笨拙。

    ExplicitCapture模式是为了在不牺牲匹配效率的前提下,提高正则表达式的可读性,一般在命名捕获组和普通捕获组混合出现,而又不关心普通捕获组的正则表达式中使用。

    Compiled

    N/A

    指定正则表达式将被编译为程序集。生成该正则表达式的Microsoft 中间语言 (MSIL) 代码;以较长的启动时间为代价,得到更快的执行速度。

    以下场景不适合使用:

    1.    对匹配效率没有要求的场景;

    2.    非常简单的正则表达式;

    3.    极少调用的方法中声明的正则表达式;

    4.    循环体中声明的正则表达式(除了动态生成的正则表达式,否则不要在循环体内声明正则表达式);

    5.    静态方法中声明的正则表达式(静态方法每次调用都需要重新编辑正则表达式,使用Compiled模式只会降低效率)。

    Singleline

    s

    指定单行模式。更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。

    单行模式通常在匹配有换行的文本时使用,采用小数点+单行模式的方式匹配任意字符,在.NET中是效率最高的。

    IgnorePatternWhitespace

    x

    指定从模式中排除非转义空白并启用数字符号 (#) 后面的注释。请注意,空白永远不会从字符类中消除。

    为了提高可读性,或是为正则表达式加注释时使用。

    RightToLeft

    N/A

    指定搜索是从右向左而不是从左向右进行的。具有此选项的正则表达式将移动到起始位置的左边而不是右边。

    除非对源字符串的构成很了解,而且又不得不使用的情况,否则不要轻易使用这一模式。

    ECMAScript

    N/A

    指定已为表达式启用了符合 ECMAScript 的行为。此选项仅可与 IgnoreCase  Multiline 标志一起使用。将ECMAScript 同任何其他标志一起使用将导致异常。

    除非对这一模式应用场景很了解,否则不要使用。

    CultureInvariant

    N/A

    指定忽略语言中的区域性差异。

    很少使用,一般无需了解。


    展开全文
  • python 正则匹配

    千次阅读 2019-06-01 16:15:13
    在python 中,正则匹配用到的还是挺的,下面总结一下常用的一些正则匹配: 精确匹配: \d可以匹配一个数字, \w可以匹配一个字母或数字, . 匹配任意的单个字符 \s可以匹配一个空格(也包括Tab等空白符) 变...

    在python 中,正则匹配用到的还是挺多的,下面总结一下常用的一些正则匹配:

    精确匹配:

    \d可以匹配一个数字,

    \w可以匹配一个字母或数字,

    . 匹配任意的单个字符

    \s可以匹配一个空格(也包括Tab等空白符)

    变长匹配:

    {N} 重复前面的单个字符N次出现

    {a,b}  重复前面的单个字符出现次数的范围在a-b次,例如:\d{3,8}   表示任意个字符(包括0个)

    * 表示任意个字符(包括0个)

    + 至少有一个,即一个或多个

    [  ]   方括号中的内容是以拆分为单个的形式,只要方括号中的出现任意一个就会匹配上

    A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'

    ^表示行的开头,^\d表示必须以数字开头。

    $表示行的结束,\d$表示必须以数字结束。

    py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。

     

    准备知识完成,在python中的正则匹配的使用模块主要是re模块:

    在使用python的re模块,导包:

    import  re

    在编写某些正则的时候,有时候需要转义,为了我们可以在编写正则匹配体的时候,加前缀就不用考虑转义的问题了:

    a="^py\\001&"
    
    b=r"^py\001&"
    #都是表示匹配'^py\001&'

    正则表达式修饰符 - 可选标志

    正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

    修饰符 描述
    re.I 使匹配对大小写不敏感
    re.L 做本地化识别(locale-aware)匹配
    re.M 多行匹配,影响 ^ 和 $
    re.S 使 . 匹配包括换行在内的所有字符
    re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
    re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

    re模块用法:

    match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

    匹配成功re.match方法返回一个匹配的对象,否则返回None。

    我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

    test = '用户输入的字符串'
    if re.match(r'正则表达式', test):
        print('ok')
    else:
        print('failed')

    re.search方法

    re.search 扫描整个字符串并返回第一个成功的匹配。

    函数语法:

    re.search(pattern, string, flags=0)

    匹配成功re.search方法返回一个匹配的对象,否则返回None。

    我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式

    re.match与re.search的区别

    re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

    检索和替换

    Python 的 re 模块提供了re.sub用于替换字符串中的匹配项,返回替换后的字符串

    语法:

    re.sub(pattern, repl, string, count=0, flags=0)

    参数:

    • pattern : 正则中的模式字符串。
    • repl : 替换的字符串,也可为一个函数。
    • string : 要被查找替换的原始字符串。
    • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配

    分组

    除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group)。比如:

    ^(\d{3})-(\d{3,8})$分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码:

    >>> 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'

    group(0)永远是原始字符串,group(1)group(2)……表示第1、2、……个子串

    贪婪匹配

    最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0

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

    由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

    必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

    >>> re.match(r'^(\d+?)(0*)$', '102300').groups()
    ('1023', '00')

     

    展开全文
  • expect中的正则匹配

    万次阅读 2021-02-07 17:52:45
    如果expect匹配是采用高级正则表达式的话(-re参数表示高级正则表达式方式匹配),那么每个子模式都有一个序号,序号从1-9,如: set output "abbbcabkkkka" expect -indices -re "b(b*).*(k+)" $output 那么: set ...
  • JavaScript 正则匹配的 Unicode 模式

    千次阅读 2019-09-28 09:28:11
    前两天室友正在看 js 关于正则表达式的博客,发现 js 正则表达式中有个 u,可以用于开启 unicode 模式,并且被博客举的两个例子搞懵了,例子如下: /^\uD83D/.test('\uD83D\uDC2A') // true /^\uD83D/u.test('\uD83D...
  • 14. Perl 正则表达式-正则匹配

    千次阅读 2019-08-27 16:04:41
    1. 正则匹配语法 Perl 的正则表达式语法非常灵活, 可以借助于内置变量$_ 进行简化, 也可以借助于m符号来自定义匹配定界符. 1.1 简写方式 简写模式使用内置变量$_与模式进行匹配. 标准模式无须...
  • .NET正则基础之——.NET正则匹配模式

    万次阅读 2009-07-31 08:08:00
    1 概述匹配模式指的是一些可以改变正则表达式匹配行为的选项或修饰符。不同的语言支持的匹配模式不同,使用的方式也不同。一般可分为全局和内联两种。下面主要介绍.NET中的匹配模式,其它语言的匹配模式,后续视...
  • .NET正则基础之——.NET正则匹配模式

    千次阅读 2010-01-06 22:35:00
    1 概述匹配模式指的是一些可以改变正则表达式匹配行为的选项或修饰符。不同的语言支持的匹配模式不同,使用的方式也不同。一般可分为全局和内联两种。下面主要介绍.NET中的匹配模式,其它语言的匹配模式,后续视...
  • JavaScript正则匹配 多行内容

    千次阅读 2020-11-11 21:53:10
    需求: 通过正则匹配给定代码块中的链接和标题 刚开始是通过以下正则匹配的, 尝试之后匹配失败 let reg = /<a href="(.*?)" class="">.<span class="title">(.*?)<\/span><\/a>/igs 观察后...
  • SQL中常用模糊查询的四种匹配模式&&正则表达式 - Little_Rookie - 博客园 http://www.cnblogs.com/nxld/p/6120049.html 使用LIKE和NOT LIKE - MYSQL - 自习教室 ...
  • 正则匹配 + re

    2019-07-29 20:56:44
    可能会遇到的正则匹配字符 ^ 匹配一行字符串的开头. 匹配任意字符,除了换行符[...] 匹配括号中的任一个,[amk] 匹配 'a','m'或'k'[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符* 匹配0个或个的表达式...
  • 使用正则匹配最后一个字符串

    万次阅读 2017-12-13 17:29:12
    使用正则匹配最后一个字符串,如123456中的3之后的字符串。
  • PyCharm Regex 正则匹配

    千次阅读 2018-11-11 16:11:41
    这几天在学习崔庆才大佬的《Python3WebSpider》...选择 Regex 正则匹配。 在上框中输入 (.*?): (.*) 。 在下框中输入 '$1': '$2', 主要到这里的冒号后面有空格,还有注意末尾有一个逗号。 最后点击 Replace all 。 ...
  • perl中的正则匹配

    千次阅读 2017-03-02 13:21:38
    perl中的正则匹配
  • lua 正则匹配

    千次阅读 2016-12-05 16:52:26
    在OpenResty中,同时存在两套正则表达式规范: Lua 语言的规范和Nginx的规范,即使您对 Lua 语言中的规范非常熟悉,我们仍不建议使用 Lua 中的正则表达式。一是因为 Lua 中正则表达式的性能并不如 Nginx 中的正则...
  • Lua 正则匹配 gsub match

    千次阅读 2018-06-06 10:29:30
    lua 正则匹配式:(大写都是相反的). 任意字符 %a 字母 %c 控制字符%d 数字%l 小写字母%p 标点字符%s 空白符%u 大写字母%w 字母和数字%x 十六进制数字%z 代表0的字符--s:字符串,pattern:正则匹配字符规则...
  • python3 常用正则匹配表达式

    千次阅读 2017-10-30 13:33:08
    python 正则匹配@(python3)在线正则匹配网站 官网 re 模块说明文档字符 符号 描述 示例 结果 . 匹配除换行符 “\n” 之外的任何单个字符。 如果要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式...
  • python正则匹配代码注释

    千次阅读 2019-03-30 14:04:44
    由于某需求,所以需要使用python正则匹配php文件中的注释并替换为空。 0x01 对于utf8编码文件的处理代码以及出现的问题 m = re.compile(r'//.*') outtmp = re.sub(m, ' ', content) m = re.compile(r'/\*.*?\*/', ...
  • PyCharm Regex 正则匹配 B站学习崔庆才大佬的2018年最新Python3.6网络爬虫实战视频学到的小技巧 在 PyCharm专业版 (社区版不行)中键入 Ctrl+R 出现如下图,打开正则表达式匹配模式 选择 Regex 正则匹配。 在上框中...
  • 贪婪匹配正则表达式趋向于最长匹配。懒惰匹配正则表达式趋向于最短匹配。举个例子:贪婪模式:pattern1 = (.*)((\.|/)part-\\d+)懒惰模式:pattern2 = (.*?)((\.|/)part-\\d+)csdntest/part-123/part-456/part-...
  • 正则匹配以xx开头以xx结尾的单词

    千次阅读 2019-07-08 15:45:01
    正则匹配
  • 威胁情报之情报采集_正则匹配

    千次阅读 2020-12-22 11:10:39
    正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序猿 们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。 主要功能:...
  • awk正则匹配

    千次阅读 2012-11-12 14:24:04
    扩展的正则表达式(Extended Regular Expression 又叫 ExtendedRegEx ...+指定如果一个或个字符或扩展正则表达式的具体值(在 +(加号)前)在这个字符串中,则字符串匹配。命令行: awk '/smith+ern/'testfile 将
  • 正则匹配中括号

    千次阅读 2018-12-29 16:37:40
    正则表达式中,前中括号 [ 属于特殊字符,要匹配它,需要转义,即加上 \;而后中括号 ] 不属于特殊字符,不必加转义字符 匹配 [宁德市物价局] var pattern = “[[]{1}(.+)]”; 对于前中括号 [,除了转义字符,...
  • Sublime开启正则匹配

    千次阅读 2017-04-05 16:44:18
    1.Ctrl+F调出搜索框。 2.如上图所示选中图中红框的三个选项。
  • perl 正则匹配多

    千次阅读 2016-12-06 19:26:55
    Vsftp:/root# cat k1.pl my $_='upDaTe'; if( $_ =~ /^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL)/i){print "1111111111111\n";}; Vsftp:/root# perl k1.pl ...
  • perl 正则匹配的次数

    千次阅读 2014-04-14 11:33:56
    正则匹配中它们是非常有用的。 ?:匹配前面的表达式0次或1次    当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,  匹配模式是非贪婪的。 * :匹配前面的表达式0次或次 ...
  • Leetcode算法——10、实现正则匹配

    千次阅读 2018-09-19 07:04:14
    给定一个输入字符串s和一个模式字符串p,实现正则匹配,支持.和*。 .可以匹配任意单个字符。 *可以匹配0个或个前一个元素。 匹配需要覆盖整个输入字符串,而非部分匹配。 备注: s 可以为空,且只会包含小写字母 a...
  • JavaScript 正则匹配中英文姓名

    千次阅读 2019-12-07 17:09:15
    工作中突然想给姓名输入框加入正则匹配的验证,以防止用户输入的姓名比网络昵称还奇葩,结果还真费了不少功夫。 首先我们确认规则: ①中英文文字不能混杂 ②汉字不能夹杂任何特殊字符和空格(如果要兼容少数民族...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 206,964
精华内容 82,785
关键字:

多模式正则匹配