点字模式匹配

时间:2013-01-14 14:54:54

标签: c# regex

我想创建一个正则表达式来匹配以句点开头的单词。单词可以在字符串中存在N次。我想确保这个词出现在行的开头,行的末尾还是中间的某个地方。后一部分是我遇到的困难。

这是我到目前为止所处的位置。

const string pattern = @"(^|(.* ))(?<slickText>\.[a-zA-Z0-9]*)( .*|$)";

public static MatchCollection Find(string input)
{
    Regex regex = new Regex(pattern,RegexOptions.IgnoreCase | RegexOptions.Multiline);
    MatchCollection collection = regex.Matches(input);
    return collection;
}

我的测试模式找到.lee.good。我的测试模式无法找到.bruce

static void Main()
{
    MatchCollection results = ClassName.Find("a short stump .bruce\r\nand .lee a small tree\r\n.good roots");

    foreach (Match item in results)
    {
        GroupCollection groups = item.Groups;
        Console.WriteLine("{0} ", groups["slickText"].Value);

    }
    System.Diagnostics.Debug.Assert(results.Count > 0);
}

4 个答案:

答案 0 :(得分:2)

也许您只是在寻找\.\w+

<强>测试

var s = "a short stump .bruce\r\nand .lee a small tree\r\n.good roots";
Regex.Matches(s, @"\.\w+").Dump();

<强>结果:

enter image description here

注意:

如果您不想在foo中找到some.foo(因为some.foo之间没有空格),您可以使用(?<=\W|^)\.\w+代替

答案 1 :(得分:1)

奇怪的是,似乎只有RegexOptions.Multiline^$只会额外匹配\n,而不是\r\n

因此,您获得了.good,因为它前面有\n,后面跟^匹配,但您获得.bruce,因为它由\r继承,但$不匹配。

您可以对输入执行.Replace("\r", ""),或重写表达式以获取单独的输入行。

修改:或在模式中将$替换为\r?$,以明确包含\r;感谢SvenS的建议。

答案 2 :(得分:0)

在你的RegEx中,一个单词必须以空格终止,但布鲁斯会被\ r \ n终止。

答案 3 :(得分:-1)

我会给这个正则表达式:

(?:.*?(\.[A-Za-z]+(?:\b|.\s)).*?)+

将RegexOptions从Multiline更改为Singleline - 在此模式下,dot匹配包括换行符在内的所有字符。