【问题标题】:One Group in Regex: Does it make sense?正则表达式中的一组:有意义吗?
【发布时间】:2013-11-14 16:09:26
【问题描述】:

它有效,但是有没有办法删除组“单词”并仍然获得相同的匹配?

string targetString = "5782\tabdikace\t101\r\n5705\tAbdul\t178\r\n5293\tabeceda\t590\r\n5769\tabecední\t114\r\n5651\tÁbel\t232\r\n5750\tÁber\t133\r\n5757\tAbcházie\t126\r\n5624\tAbigail\t259"

var matches = Regex.Matches(targetString, "[0-9]+\t(?<word>[^\t]+)\t[0-9]+");
foreach (Match w in matches)
{
    wordsList.Add(w.Groups["word"].ToString());
}

【问题讨论】:

    标签: c# regex regex-group


    【解决方案1】:

    您可以使用positive lookbehind and lookaheads 执行此操作。这些检查在一个点之前或之后是否存在与模式匹配的文本存在,而不在匹配中包含和使用该文本。

    相当于你的表达方式是

    (?<=[0-9]+\t)[^\t]+(?=\t[0-9]+)
    

    请注意,这不一定给出与原始表达式相同的结果。请看以下内容:

    Input string                       0\t one \t1\t two \t2\t three \t3
    Groups in original version         11111111111         2222222222222
    Groups in new version              ...11111...         ...3333333...
    . = checked but not consumed                 ...22222...
    

    观察如何,因为 loohahead 和lookbehind 组不使用/匹配12,只检查它们是否存在,它们允许匹配值" two ",而您的原始表达式没有。是否要这个由你决定。

    【讨论】:

    • 谢谢,现在我明白了。此外,我已经对其进行了测试,它比我原来的 Expression 慢了大约三倍。
    • 这是一个缺点,是的。您的原始表达式是有效的,因为引擎永远不必回溯,即找到匹配的开始,匹配几个字符,找到不匹配的内容,然后一直返回并从下一个字符重试。我相信,我的人会花一些时间尝试匹配数字(因为它们不是标签,并且它们之前有一个标签......但是在那之前是一个字母,而不是数字)。老实说,如果您的输入是您提供的所有格式(数字选项卡单词选项卡数字换行符),我会坚持您所拥有的:)
    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2018-12-20
    相关资源
    最近更新 更多