我不明白"?!"在正则表达式

时间:2015-09-11 13:45:41

标签: regex

这就是我试图避免匹配的问题(以粗体显示): ( 2 Kgs 24.18-20 ; Jer 52.1-3a)
但我想匹配第二部分(Jer 52.1-3a)
这是我的搜索:(?!\d )([A-Z]?\w{1,3} \d+(—|–\d+)?(\.\d+)?(—|–\d+)?(\d+)?(\.\d+)?)(\w)?(此搜索有很多不同的变量)
它保持匹配Kgs 24.18-20我不是100%确定如何使用?!正确地为此

5 个答案:

答案 0 :(得分:1)

检查是否有效:

(?<=; )(.*)(?=\))

Demo on regex101

答案 1 :(得分:0)

首先尝试用\ d \ s替换那些:

(\d\s)(\w{1,3}\s[^\s]+)

然后用:

替换其余部分
(\w{1,3}\s[^\s]+)

这会有用吗?

答案 2 :(得分:0)

你能不能进入分号以避免你不想要的东西?和/或制作所需的尾随字母,以便图案不匹配不需要的部分?

/;\s+                  # semi-colon and space
 ([A-Z][a-z]{1,3}\s+   # ref name and space
 \d[\d.]*[a-z]?        # number, optional point, optional letter
 -                     # hyphen
 \d[\d.]*[a-z])        # number, optional point, REQUIRED letter
/x;

或者

 /; ([A-Z][a-z]{1,3} \d[\d.]*[a-z]?-\d[\d.]*[a-z])/

答案 3 :(得分:0)

我认为你遇到的问题是

(?<!\d )

是一个负面的展望。它表示您不想匹配的模式的初始字符Kg可能不是数字后跟空格。而且他们不是 - 他们是一个大写字母,后跟一个小写字母。

正如stribizhev的评论中所讨论的,背后的负面看法可能就是你想要的。换句话说,你想说从Kg开始是可以的,除了当你看到Kg之前的字符时你会发现有一个数字后跟一个空格。当我在regex101上测试以下内容时,它匹配以Jer开头的部分,但不匹配以Kgs开头的部分,我认为,它保留了正则表达式的原始意图。

(?<!\d )([A-Z]\w{1,3} \d+(—|–\d+)?(\.\d+)?(—|–\d+)?(\d+)?(\.\d+)?)(\w)?

答案 4 :(得分:0)

?!用于查看是否存在您想要匹配的内容。例如在foobarfoo中,如果你想匹配所有未跟随“b”的“o”,你可以使用正则表达式/o(?!b)/这将匹配第一个,第三个和第四个“o”秒。 This link可能会帮助您更好地理解。你也可以练习一些正则表达式here

在您的情况下,如果您只想查找String的第二部分,可以通过查找;来启动正则表达式。这将忽略第一部分,因为它不以分号开头。