如何反转正则表达式模式?
假设我有这样一个字符串:
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不在“禁止字符列表”中。