Regex-除给定单词外的所有有效标识符



假设我想要一个正则表达式,它接受除给定单词(例如"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|$))

演示

它将检查句子中的所有单词。

最新更新