以下句子映射正则表达式匹配到原始的字符串
我有一辆红色轿车
可以转化为这个字符串
代词动词限定词形容词名词
我想要的是找到部分原件句子是名词短语(NP)。一个NP的简单模式是(定义)*(形容词)*(名词)(其中*表示该组可能出现零次或多次)。实际正则表达式是:
public static string Regex = "((?:Determiner.?)*(?:Adjective.?)*(?:Noun.?))";
使用下面的代码就可以提取所有的NP:
MatchCollection NPmatches = Regex.Matches(structure, NounPhrase.Regex);
foreach(Match match in NPmatches)
{
foreach (Capture NPcapture in match.Captures)
{
Console.WriteLine(NPcapture.Value.ToString());
}
}
输出将是:
限定词形容词名词
什么我真的需要的是对应于该结构的原始句子的部分( NP),在这种情况下,这将是
一辆红色轿车
我可以找出某种方式在正则表达式匹配的位置,并计算从那里字数,但它是混乱和错误俯卧。如果可以使用一些LINQ表达式与正则表达式结合起来,那将是非常好的,以便保持转换的来源。任何虽然?
PS。一个句子使用此代码
RawSentence.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Select(i=>i.Type.ToString()).Aggregate((x,y) => x + " " + y);
不能说我明白你在问什么。 match * does *返回原始语句的匹配部分。如果您使用命名组,您甚至可以按名称引用组。 – 2015-02-09 11:13:36
这里的问题是我想要我的原始句子的相应部分。我正在执行的正则表达式操作的字符串是* not *原始字符串,它是一个转换后的字符串。在这种情况下,我原来的句子是“我有一辆红色的车”。对于这种分析,我需要将其转换为以下字符串:“代词动词Determiner形容词名词”。当我找到我的名词短语时,我没有一个清楚的方式来知道我原来的句子的哪一部分对应于它(“一辆红色的汽车”)。 – Sturm 2015-02-09 11:17:12
没有时间详细说明,但想知道我会做什么:您可以使用第二个正则表达式,将用空格分隔的未变换句子的每个单词分组,然后使用捕获变换句子的匹配组,而不是那些不捕获的“(?:determineiner。?)”,然后在第二个正则表达式中使用你现有的匹配组。 – 2015-02-09 11:23:06