如何"not"选择正则表达式模式中的第一个字符?



我是RegEx的初学者,正在尝试识别短信中不同语句的结尾。请参阅下面的屏幕截图。

我怎样才能避免选择下一个字母,然后用句号表示语句的结束。

请注意,有些语句具有<.><Alphabets>,而有些语句则具有<.><space><Alphabets>

使用的Regex:r". ?[D]"

示例短信:-我只想选择句号和空格(如果有的话(。

Txn of USD 00.00 done using TC XX at POS*MERCH on 30-Feb-22. Avl bal:USD 00.00. Call xxxxxx for dispute or SMS BLOCK xxxx to xxxxxxx
Acct XX debited with USD XX.00 on some date.Info: ABC*BDECS-XYZ.Avbl Bal:USD yy,xxx.95.Call xxxxxx for dispute or SMS BLOCK xx to xxxxx

RegExr在常规模式上的屏幕截图

您想要的是一个前瞻组。无论你是正面展望并使用否定的字符集D,还是负面展望字符集d,都无关紧要——我将在下面概述这两个:

regex = r". ?(?=D)"  # asserts that the following character matches D
regex = r". ?(?!d)"  # asserts the following character does NOT match d

还有后面的变体(?<!pattern)(?<=pattern),它们断言模式在当前位置之前不匹配。

这些组中没有一个捕捉到匹配的文本——它们只是";向前看";或";向后看";而不改变状态。

使用. ?[D]是匹配单个非数字字符,但该非数字字符本身也可以是空格或换行符。

如果只想匹配一个点,但不想在它是字符串中的最后一个字符时匹配,则可以断言不带换行符的可选空格。

然后匹配不是数字的非空白字符。

.(?=[^Sn]*[^sd])

模式匹配:

  • .匹配一个点
  • (?=正向前瞻断言当前位置右侧的内容为
    • [^Sn]*匹配不带换行符的可选空白字符
    • [^sd]匹配除数字以外的单个非空白字符
  • )关闭前瞻

查看regex演示。

最新更新