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();

結果:

ここに画像の説明を入力

ノート:

fooin を検索したくない場合( と の間にsome.foo空白がないため)、代わりに を使用できます。some.foo(?<=\W|^)\.\w+

于 2013-01-14T15:22:34.303 に答える
1

奇妙なことに、 with RegexOptions.Multiline, ^and$はさらに にのみ一致し、 . には一致\nしないよう\r\nです。

したがって.good、 が前にあるため取得できますが、\n一致しないが後に続くため取得^できません.bruce\r$

.Replace("\r", "")入力に対して a を実行するか、式を書き直して個々の入力行を受け取ることができます。

編集: または、パターン内で に置き換え$て、 ;\r?$を明示的に含めます。提案を\rありがとう。SvenS

于 2013-01-14T15:10:31.883 に答える
0

正規表現では、単語はスペースで終了する必要がありますが、ブルースは代わりに \r で終了します。

于 2013-01-14T15:03:20.360 に答える
-1

私はこの正規表現を試してみます:

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

RegexOptions を Multiline から Singleline に変更します。このモードでは、ドットは改行を含むすべての文字に一致します。

于 2013-01-14T15:24:56.737 に答える