1

我希望评估类似于以下的结构:

房子是绿色的,但我最喜欢的颜色是蓝红和黄

我用这样的正则表达式确定房子的颜色:

房子\s+(\w\s*)+(?=(青色|绿色|红色|蓝色))

它有什么作用?此表达式返回下一个匹配项:

房子是绿色的,但我最喜欢的颜色是蓝色

也就是说,返回字符类颜色列表中字符串中的最后一个匹配项,即直到出现红色,但您看到的第一个颜色是绿色。

我应该怎么办?我正在寻找的是只取列表中提到的第一种颜色并停止查找,即告诉我房子颜色是绿色的,没有别的。

Q1:如何循环遍历字符串,直到只出现一个且只有一个您指示的表达式,即如何将表达式(青色或绿色或蓝色或红色)转换为行为类似于 XOR 的列表。重要:只使用正则表达式,即没有任何como.NET背景语言、Java、PERL等...

Q2:有没有我错过的使用正则表达式的替代方法。也就是说,我走的路是对的吗?

先谢谢大家了

4

2 回答 2

1

它返回最新的比赛,因为你(\w\s*)+贪婪的;它尽可能匹配(即一直到“红色”之前)。

您可以将其更改为非贪婪使用+?而不是+

the house\s+(\w\s*)+?(?=(cyan|green|red|blue))

但我认为你可以做得更好。

为什么(\w\s*)+您可能一次只匹配一个字母!为什么不匹配整个单词而不是(\w+\s+)+.

另外,为什么不直接匹配第一种颜色呢?

the\s+house\s+(\w+\s+)+?(cyan|green|red|blue)

然后捕获组 2(第二组括号)将包含第一次出现的青色、绿色、红色或蓝色(即您的颜色列表)。请注意+?确保单词正则表达式是非贪婪的,这意味着它不会吞噬“青色”、“绿色”、“红色”或“蓝色”的实例。

你甚至可以做

house.*?\b(cyan|green|red|blue)

那里.*?是非贪婪的,只是吞噬一切,直到第一种颜色。例如,这是一个“单词边界”,只是确保正则表达式与“desi red\b ”中的“red”不匹配。

于 2012-04-03T23:38:28.727 回答
0

这就是我在 python 中的做法,我不确定其他语言是否具有 .seach 功能。

“我正在寻找的是只取列表中提到的第一种颜色并停止寻找,”

s='The house is green but my favorite colors are blue red and yellow'
import re
print re.search('(cyan|green|red|blue)',s,).group(1)
print re.match('The house is (cyan|green|red|blue)',s,).group(1)#or if u had to use the .match

请注意(青色|绿色|红色|蓝色)中缺少空格。

它打印这个:

green
green
于 2012-04-03T23:37:13.720 回答