0

我想从大文本块中识别特定模式,我将使用 C#.NET 正则表达式库。

IE

1. This camera support Monochrome, Neutral, Standard, Landscape and Portrait [...More words...] settings furnish advanced, personalized color control.
Output shall be: Array ["Monocrome", "Neutral", "Standard", "Landscape", "Portrait"]

它还应避免“提前”,因为 , 后跟单词。

我目前正在使用表达式(([\S]+)( {0,3})?(,|and))返回所有单词,直到。你能建议我在and之后包含单词的表达吗?

干杯! 尼莱

4

3 回答 3

2

你有没有尝试过:

 (([\S]+)( {0,3})?(,|and|\.))

http://regexr.com?355ci

于 2013-06-07T14:21:03.467 回答
0

使用环视找到正确答案

问题:当提前比较时,正则表达式光标将在预先参考上,即 Monochrome, Neutral, Standard, Landscape and Portrait认为and是捕获的一部分,而不是该词将无法用于下一次捕获,因此它不会捕获肖像。正确的方法是向前和向后使用环视。

(?=( {0,1})?(,|and)))是正确的向前看,(?<=( {1,3}(and|or) {1,3}))是正确的向后看。

于 2013-06-07T15:13:12.727 回答
0

匹配列表并不太难,但将其正确放入列表更难,而且我怀疑我在 perl 中使用的机制取决于语言(我不使用微软产品,所以我不会给它你在 C# 中)。

在 perl 中,我会做如下的事情。这不是一个单一的正则表达式答案,但我认为代码更清晰。

$string = "This camera support Monochrome, Neutral, Standard, Landscape and Portrait foo bar baz";

$re_sep = "(?: {0,3}, {0,3}| {1,3}and {1,3})";
$re_list = "\w+(?:$re_sep\w+)+";

($list) = $string =~ m/($re_list)/;
@list_elements =  split /$re_sep/, $list;
于 2013-06-07T16:04:41.160 回答