3

我试图找到单词“I”和“disagree”(不区分大小写)之间的最短字符序列。我已经阅读了关于 SO 的所有类似问题,但似乎没有一个解决方案对我有用。这是一个让我感到悲伤的例句:

作为一个美国人,我必须不同意你的看法。

这是我对正则表达式模式的最佳猜测:

我不同意

我只想捕获" must ",但相反,我正在捕获更长的字符串"can, I must "。我希望不必指定“I”后面必须跟其他东西,比如空格。因为,那样我就不会在“我不同意那个”这样的句子中捕捉到任何东西。我也不想坚持将“I”大写。基本上,我只想要尽可能不贪婪的匹配。该站点是我用来验证解决方案的地方之一:

http://regexpal.com/?flags=gi®ex=I%28.*%3F%29%20disagree&input=As%20an%20American%2C%20I%20must%20disagree%20with%20you。

4

3 回答 3

1

一般的方法是使用负前瞻

(I)(((?!\1).)*?) disagree

在此处查看演示

注意中间单词的组是 now $2。如果你不想这样,你可以重复第一个词:

I((?:(?!I).)*?) disagree

但我想说第一个版本更容易维护,特别是如果单词更大

于 2013-08-04T05:47:53.093 回答
1

使用单词边界 ( \b):

/\bi(.*?)\bdisagree/i
  • 不区分大小写
  • 匹配I,但不匹配I'll'll将成为捕获的一部分)
于 2013-08-04T05:50:47.703 回答
1

你需要对正则表达式使用环视,使用这个正则表达式(?<=[iI])(\W.*)(?=disagree),你只会得到我和不同意之间的词。

这里的例子

于 2013-08-04T05:55:16.257 回答