2

我想创建一个正则表达式来匹配以句点开头的单词。单词可以在一个字符串中存在 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

4 回答 4

2

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

测试:

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

结果:

在此处输入图像描述

笔记:

如果您不想foo在 in中查找(因为andsome.foo之间没有空格),您可以改用。some.foo(?<=\W|^)\.\w+

于 2013-01-14T15:22:34.303 回答
1

奇怪的是,似乎 with RegexOptions.Multiline^并且$只会额外匹配\n, not \r\n

因此你得到.good是因为它前面\n是匹配的^,但你没有得到.bruce是因为它\r后面是不匹配的$

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

编辑:或在您的模式中替换$\r?$明确包含\r; 感谢SvenS您的建议。

于 2013-01-14T15:10:31.883 回答
0

在您的 RegEx 中,单词必须以空格结尾,但 bruce 以 \r 结尾。

于 2013-01-14T15:03:20.360 回答
-1

我会试试这个正则表达式:

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

并将 RegexOptions 从 Multiline 更改为 Singleline - 在这种模式下,点匹配所有字符,包括换行符。

于 2013-01-14T15:24:56.737 回答