regex 正则表达式

实际中遇到过的

(?<!\.)\b\w+(Date)(?=[;(])

匹配:"Date" 在这些字符串里 "somewords someDate;", " someDate;" "someDate(", "someDate;"
不匹配: " Date(", " Date;", "Date;", " Date", "someDate", "Java.localDate;"
解释:

  • (?<!\.): 负向后行断言(negative lookbehind assertion),确保匹配的字符串前面不是一个句点(.)
  • (Date): 捕获组, 匹配字符串 Date 并将其捕获为一个组
  • (?=[;(]): 前瞻断言 (lookahead),表示 "Date" 之后必须紧跟一个分号 ";" 或左括号 "("

我之前一直搞不定如何满足不匹配 "Java.localDate;" 这个字符串里的 "Date",我在stackoverflow上发了篇帖子问这个问题。很快得到了高手的帮助,给出了以上的答案

常用正则表达式

基础模式

'.' 通配符。匹配除换行符外的任何单个字符

c.t

匹配: cat, cot, cut, c3t
不匹配: ct, caat

解释:在这个例子中,它匹配 'c' 和 't' 之间的任何一个字符。但不匹配 "ct"(因为中间没有字符)或 "cast"(因为有两个字符)。

'*' 零或多次。'*' 前面的字符可以出现零次或多次

ca*t

匹配: ct, cat, caat, caaat
不匹配:: cot, cut, c3t

解释:'*' 前面的字符 'a' 可以出现零次或多次。它不匹配 "cot" 或 "c3t",因为 'c' 和 't' 中间的字符不是 'a'。

'.' 和 '*' 组合使用

c.*t

匹配: ct, cat, cot, cut, c@t, c t, caaat
不匹配: ca, at, tc

解释:'.*' 组合可以匹配任意数量的任意字符。在这个例子中,模式要求字符串以 'c' 开始,以 't' 结束,中间可以是任何内容(包括没有内容)。

'?' 零次或一次。'?' 前面的字符可以出现零次或一次

ca?t

匹配: ct, cat
不匹配: caat, cot, cut, c3t

'+' 一次或多次, '+' 前面的字符必须出现一次或多次

ca+t

匹配: cat, caat, caaat
不匹配: ct, cot, cut

解释:
在这个例子中,'a' 必须至少出现一次。这就是为什么它匹配 "cat"(一个 'a')、"caat"(两个 'a')和 "caaat"(三个 'a')。但它不匹配 "ct"(没有 'a')、"cot" 或 "cut"(因为中间的字符不是 'a')。

'\w' 单词字符,包括字母、数字和下划线

c\wt

匹配: cat, cot, cut
不匹配: ct, c@t, c t

解释:在这个例子中:不匹配 "ct",因为缺少中间的字符。不匹配 "c@t" 或 "c t",因为 @ 和空格不是单词字符。

'\d' 数字

c\dt

匹配: c1t, c2t, c3t
不匹配: cat, cot, cut

'^' 字符串始

^cat

匹配: cat in "cat is cute"
不匹配: cat in "the cat is cute"

'$' 字符串尾

cat$

匹配: cat in "look at the cat"
不匹配: cat in "cat is cute"

'()' 捕获组

(ca)+t

匹配: cat, cacat, cacacat
不匹配: ct, cot, cut
解释:(ca)+ 匹配一个或多个 "ca" 重复,后面跟着 "t"。

'{n}' 精确重复, 前面的模式必须精确重复n次

(c.t){3}

匹配: catcotcut, cutcatcot, cotcutcat, catcatcat, cotcotcot
不匹配: catcot
{n,m}' 前面的模式重复n~m次

交替

cat|cot|cut
c[aou]t

匹配: cat, cot, cut
不匹配: ct, caat, cooot