假设我想要一个正则表达式,它接受除给定单词(例如"foo")之外的所有有效标识符(例如[a-zA-Z][a-zA-Z0-9]*
)。将"foo"作为单词一部分的单词,例如"foobar",也可以。我试着使用否定的前看和后看,但我很挣扎,因为我想允许使用像"foobar"这样的词,而这种词会被否定的前视所禁止。我该怎么做?
您可以尝试以下操作。
^(?!foo$)[a-zA-Z][a-zA-Z0-9]*$
(?!foo$)
在开始处的否定前瞻断言该行将不包含确切的字符串foo
。
演示
String s[] = {"foobar", "foo", "bar", "foom", "mfoo"};
for(String i: s)
{
System.out.println(i.matches("(?!foo$)[a-zA-Z][a-zA-Z0-9]*"));
}
输出:
true
false
true
true
true
^(?!foo$)[a-zA-Z][a-zA-Z0-9]*$
只需添加前瞻性即可。预测器将检查该单词是否不是foo
。
或
^(?!foo\b)[a-zA-Z][a-zA-Z0-9]*$
请参阅演示。
https://regex101.com/r/zB3hI5/2
虽然其他两个答案都是正确的,但看起来你只需要这个条件:
input != "foo"
如果确实是这种情况,为什么不保持简单并使用这个条件:
( !input.equals("foo") && input.matches( "[a-zA-Z][a-zA-Z0-9]*" ) )
我不知道我是否让它变得复杂,但如果你想逐字逐句地获取正则表达式,那么正则表达式将看起来像:
((?!(?:s|^)foos)(?:s|^)[a-zA-Z][a-zA-Z0-9]*(?=s|$))
演示
它将检查句子中的所有单词。