java - 正则表达式:不以 "hede"结尾

标签 java regex lookaround

[更新了答案]

  1. 不以“hede”开始:^(?!hede).*$
  2. 包含“hede”:^((?!hede).)*$
  3. 不以“hede”结束:(?s)^.*+(?<!hede)$

所有 3 个表达式都有效。

检查:

Pattern p = Pattern.compile("(?s)^.*+(?<!hede)$");
assertTrue( p.matcher("hede obsolete").matches()); //ok 
assertTrue( p.matcher("obsolete hede obsolete").matches()); //ok
assertFalse(p.matcher("obsolete hede").matches()); //ok

最佳答案

关于^.*(?<!hede)$的一些话@vks 建议的解决方案:在一种情况下会很好 - 使用 所有格量词和 .* , .*+ .更新后的正则表达式如下所示:

(?s)^.*+(?<!hede)$
       ^

此外,内联修饰符 (?s)可用于强制 .匹配换行符,这样我们也可以检查多行字符串是否以 hede 结尾.

加号有很大的不同。(?<!hede)向后看 .*前面的模式正在检查 hede每次测试一个字符时,这个正则表达式都不太稳定。所有格量词将确保在整个字符串/行匹配后不会发生回溯,并且只有在它之后才会对 hede 进行 1 次检查。执行缺席。

作为替代方案,您可以在开始时使用否定前瞻来检查字符串是否以 hede 结尾。 (此版本可与 matcher.find 一起使用):

(?s)^(?!.*hede$)

或者,匹配不以 hede 结尾的整行/字符串:

(?s)^(?!.*hede$).*

参见 regex demo

IDEONE demo , 例如 matches() (末尾没有 $,因为整个字符串必须匹配):

System.out.println("A string with hede".matches("(?s)^(?!.*hede$).*")); // => false
System.out.println("A string without".matches("(?s)^(?!.*hede$).*")); // => true

关于java - 正则表达式:不以 "hede"结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211288/

相关文章:

Python 正则表达式 : Capture lookahead value (capturing text without consuming it)

正则表达式:赛前/赛后环视

java - Cassandra 3 中的 org.apache.cassandra.auth.Auth 去了哪里?

java - 如何用Java实现一定的布局

regex - 如何在 VBA 中使用 RegExp 隔离空格(\s 与\p{Zs})?

python - 如何用正则表达式可移植地解析(Unicode)度数符号?

regex - 排除子目录

r - 在 R 中的特定模式之后的任何位置查找第一个数字

java - 寻找数组中最短的项?

java - 我想在 Android Activity 中制作一个可滚动的带有图像的文本列表。我应该用什么?