匹配1-100的整数或包含两位小数的浮点数

匹配1-100的整数或包含两位小数的浮点数

正则表达式一

    (?<!\d)(?:100|[1-9]\d?)(?!\d)(?:\.\d{2})?

测试结果(蓝色为匹配内容):
1
10
100
1.00
100.00
111
100
100
100.000

正则表达式二

    (?<!\d)(?:100|[1-9]\d?)(?!\d)(?P<dot>\.\d{2}(?!\d))?(?(dot)|(?!\.))
    或
    (?<!\d)(?:100|[1-9]\d?)(?!\d)(\.\d{2}(?!\d))?(?(1)|(?!\.))

测试结果(蓝色为匹配内容):
1
10
100
1.00
100.00
111
100
100
100.000

正则表达式二用到了条件语句。

    (?(id/name)...|...)

相当于 if (id/name) ... else ...'
示例:
a(b)?(?(1)c|d)’ 匹配 abc 和 ad

注意

作为条件的正则表达式一定要是一个可选的,即:
(…)?

匹配不以 abc 开头的单词

目标

匹配不以 abc 开头的单词

分析

从单词的开始位置开始匹配,可以用 \b 匹配单词的开始位置。

    \b

“不以 abc 开头”,也就是说:”单词的开始位置的右边不是 abc”
匹配这种”在某个位置的左边/或右边不是xxx”的需求,需要用到正则表达式中的
环视功能,在这里先简单介绍一下正则表达式中环视(lookaround)的概念

环视

环视结构不匹配任何字符,只匹配文本中的特定位置
这一点与单词分界符 \b 、锚点 ^$ 相似。

四种类型的环视

类型 正则表达式 匹配成功的条件…
肯定逆序环视
否定逆序环视   
(?<=……)
(?<!……)
子表达式能够匹配左侧文本
子表达式不能匹配左侧文本
肯定顺序环视
否定顺序环视
(?=……)
(?!……)
子表达式能够匹配右侧文本
子表达式不能匹配右侧文本

由上可知,”右边不是 abc” 可以使用否定顺序环视

    (?!abc)

可以用 \w 匹配单个单词字符

最终的正则表达式

    \b(?!abc)\w+

不使用 \b :

    (?<!\w)(?=\w)(?!abc)\w+

留个问题:如何匹配不包含 abc 的单词。

以上,请大家多多指教。

(?<!\w)(?=\w)(?:(?!abc)\w)+(?<=\w)(?!\w)

\b(?:(?!abc)\w)+\b