我有字符串:
FirstWord word2 word3 wrongWord word4 lastWord
希望选择以FirstWord
开头的字符串,以lastWord
结尾且不包含wrongWord
。
我是第一个也是最后一个:
/ firstword(。*?)lastword / i
但排除wrongword
不起作用。
尝试:
/ firstword(^ wrongWord *?)lastword / i
/ firstword ^((?!wrongWord)。)* lastword / i
更像这样,但没有任何作用。
答案 0 :(得分:8)
以下是什么问题?
/^firstword ((?:(?!wrongword).)+) lastword$/i
请参阅live demo
正则表达式:
^ the beginning of the string
firstword 'firstword '
( group and capture to \1:
(?: group, but do not capture (1 or more times)
(?! look ahead to see if there is not:
wrongword 'wrongword'
) end of look-ahead
. any character except \n
)+ end of grouping
) end of \1
lastword ' lastword'
$ before an optional \n, and the end of the string
答案 1 :(得分:2)
你可以使用这个技巧:
/^firstword ((?:[^w]+?|\Bw|w(?!rongword\b))*?) lastword$/i
或更高效:
/^firstword ((?>[^w\s]++|\s(?!lastword$)|\Bw|w(?!rongword\b))*+) lastword$/i
答案 2 :(得分:2)
答案 3 :(得分:1)
如果禁用词恰好是较长词的一部分怎么办?例如,如果您希望字符串以“first”开头并以“last”结尾但不包含单词“word”,该怎么办?例如:
"first one two word last" # don't match
"first three wordplay four last" # OK
"first five swordfish six seven last" # OK
调整接受的答案会给你:
/^first (?:(?!word).)+ last$/i
...但是这会拒绝所有三个字符串。无论如何,无需在每个位置执行前瞻。只需在每个单词的开头处执行一次:
/^first(?:\s+(?!word\b)\w+)*\s+last$/i
请参阅live demo