如何反转正则表达式模式?

1 投票
2 回答
62 浏览
提问于 2025-04-14 17:03

假设我有这样一个字符串:

exampleString = 'Hello @world! This is a #sample ^string 5with @words that ^start with symbols.'

我想打印出所有不以符号开头的单词。

pattern = '[@^#!%&*].*?\s'

我有这个模式,它可以选出所有以符号开头的单词。现在我的问题是:怎么把它反过来,让它匹配不以符号开头的单词呢?

我试过 (?!),但好像没有效果。

2 个回答

0

在我看来,简单的方法是从另一个方向来思考这个问题,打印出所有以你想要的字符开头的单词,也就是 [a-zA-Z0-9] 这个范围内的字符。(如果下划线也是可以接受的,你可以用 \w。)

0

你可以通过在方括号开头加上^来表示一组字符的反义,比如说 [^a-z] 就表示除了从a到z的字母以外的任何字符。

所以使用

[^@^#!%&*] 

会匹配任何以字母或符号开头的单词,但不包括@、^、#、!、%、&和*这些符号。

如果我使用这个正则表达式

[^@^#!%&*\s][^\s]*

它的意思是:

[^@^#!%&*\s]         : 1 char not symbol nor space
            [^\s]*   : 0 or more chars not space

我会得到一个以@开头的单词,因为“word”符合这个条件(w是第一个字符,ord是后面的三个字符)。

所以我需要说明第一个字母也必须是单词的第一个字母,因此在它前面应该有一个空格或者句子的开头。

这就是最终的正则表达式

(^|\s+)[^@^#!%&*][^\s]*

解释如下:

(^|\s+)                   : the start of the sentence or more than one space
       [^@^#!%&*]         : followed by a character not in the set
                 [^\s]*   : followed by 0 or more chars not spaces

注意到单词5with也被匹配,因为5不在“禁止字符列表”中。

撰写回答