4

我有字符串:

FirstWord word2 word3 wrongWord word4 lastWord

想要选择以 开头FirstWord、以 结尾lastWord且不包含的字符串wrongWord

对于第一个和最后一个我有:

/firstword (.*?) lastword/i

但排除wrongword没有用。

试过:

/firstword (^wrongWord*?) lastword/i

/firstword ^((?!wrongWord).)* lastword/i

更像这样,但没有任何效果。

4

4 回答 4

9

简单的以下有什么问题?

/^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
于 2013-11-14T14:27:18.913 回答
2

你可以使用这个技巧:

/^firstword ((?:[^w]+?|\Bw|w(?!rongword\b))*?) lastword$/i

或更高效:

/^firstword ((?>[^w\s]++|\s(?!lastword$)|\Bw|w(?!rongword\b))*+) lastword$/i
于 2013-11-14T14:17:32.180 回答
2

请参阅此示例

使用的正则表达式是

/firstword((?!wrongword).)*lastword/i
于 2013-11-14T14:27:47.937 回答
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

观看现场演示

于 2013-11-14T16:21:25.233 回答