5

一段时间以来,我一直在努力解决这个问题:我想捕获所有[a-z]+[0-9]?字符序列,不包括诸如sin|cos|tanetc 之类的字符串。所以在完成了我的正则表达式作业后,以下正则表达式应该可以工作:

(?:(?!(sin|cos|tan)))\b[a-z]+[0-9]?

如您所见,我正在使用负前瞻和交替 -\b在非捕获组右括号之后对于避免匹配等至关重要insin正则表达式是有意义的,事实上我已经尝试使用 RegexBuddy 和 Java 作为目标实现并获得想要的结果,但使用 Java Matcher 和 Pattern 对象不起作用!有什么想法吗?

干杯

4

3 回答 3

6

\b是在错误的地方。它将寻找一个之前没有 sin/cos/tan 的单词边界。但是紧随其中任何一个的边界末尾都会有一个字母,所以它必须是一个词尾边界,如果下一个字符是 az 则不能。

此外,否定前瞻将(如果有效)排除字符串cost,如果您只是过滤掉关键字,我不确定您是否想要。

我建议:

\b(?!sin\b|cos\b|tan\b)[a-z]+[0-9]?\b

或者,更简单地说,您可以在\b[a-z]+[0-9]?\b之后匹配并过滤掉关键字列表中的字符串。您不必总是在正则表达式中做所有事情。

于 2010-02-03T10:42:49.833 回答
1

所以你想要[a-z]+[0-9]?(至少一个字母的序列,可选地后跟一个数字),除非该字母序列类似于sin cos tan

\b(?!(sin|cos|tan)(?=\d|\b))[a-z]+\d?\b

结果:

cos - 不匹配
舒适 - 完全匹配
cos1 - 不匹配
cosy1 - 完全匹配
bla9 - 完全匹配
bla99 - 不匹配
于 2010-02-03T10:45:39.640 回答
0

我忘了逃避\bfor java 所以\b应该是这样\\b,它现在可以工作了。干杯

于 2010-02-03T11:11:53.900 回答