以下の正規表現を使用して、単語の前の数字を取得します。
例:
838123 someWord 8 someWord 12 someWord
(\d+)\s*someWord
ただし、Numberとwordの間に何かが発生する場合があります。以下のサンプル行を参照してください。
例:
43434 of someword 12何かsomeword 2323新しいsomeword
正規表現を使用してその単語の前の正確な数字を取得するにはどうすればよいですか?
あなたの提案をお願いします。
以下の正規表現を使用して、単語の前の数字を取得します。
例:
838123 someWord 8 someWord 12 someWord
(\d+)\s*someWord
ただし、Numberとwordの間に何かが発生する場合があります。以下のサンプル行を参照してください。
例:
43434 of someword 12何かsomeword 2323新しいsomeword
正規表現を使用してその単語の前の正確な数字を取得するにはどうすればよいですか?
あなたの提案をお願いします。
回答:
一致があればCinCoutの答えから、一つの可能な「見逃しコーナーケース」であるsomeWord場合など、正確でなければならないnotsomeWordとsomeWordNotThis一致させるべきではありません。
その正規表現への次の拡張は、これに対処する方法を提供します。
(\d+)[^\d]*[^\w]some[wW]ord[^\w]
説明:[^\w]ため、整合の前または後someWordのために見て、「非単語文字」前と後-ラインの終わりにも、ここでカウントします。もちろん、これは正確な要件に応じて、より複雑/特定にすることができます。
最初の分離some[wW]ord、number及びspaceパターンと、その上の第2パターンを実行します
var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
var rgx = new Regex(pattern);
var sentence = "43434 of someword 12 anything someword 2323 new someword";
var result = string.Empty;
foreach (Match match in rgx.Matches(sentence)){
result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword
var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);
var resultOnCorrectSentence = new List<string>();
foreach (Match match in rgxOnCorrectSentence.Matches(result)){
resultOnCorrectSentence.Add(match.Value);
}
resultOnCorrectSentence.ForEach(Console.WriteLine);
Console.ReadKey();
最初のパターンが実行されると、文は希望どおりになります
43434 of someword 12何かsomeword 2323新しいsomeword
変化する:
43434 someword 12 someword 2323 someword
を使用\s*すると、0個以上の空白文字のみが一致します。
使用できます\D+が、数字以外の任意の文字と一致するため、改行も一致します。
同じ行の数字を一致させたい場合は、否定された文字クラスに一致しない改行を追加できます [^\d\r\n]
この例ではを使用\dしていますが、1 桁以上の0〜9の数字のみを照合する場合は、文字クラスを使用できます。[0-9]+
数字と単語がより大きな単語の一部になるのを防ぐために、単語の境界を利用できます。 \b
大文字と小文字を区別しない方法で単語を一致させる場合は、RegexOptions.IgnoreCaseまたはインライン修飾子を使用できます(?i)
(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b
.NET 正規表現のデモを見る
名前付きマッチキャプチャを使用して(データを取得するにはmtch.Groups["Value"].Value...など)、必要に応じて情報を抽出します。
(?<Value>\d+) -- Get the digits
(?<Other>.+?) -- Capture all text, but minimal (greedy) capture
(?<Key>someword) -- til the keyword here.
上記を実行すると(そうでIgnorePatternWhiteSpaceない場合はコメントを削除してパターンに参加し、(?<Value>\d+)(?<Other>.+?)(?<Key>someword)正規表現オプションなしなどで実行します)、各データ/キーペアのデータを取得し、それぞれを1つの一致に編成します。
結果
これが(2番目の例の)結果です。これらはすべて個々の一致に含まれ、グループとキャプチャは各一致で提供されます。
Match #0
[0]: 43434˽of˽someword
["Value"] → [1]: 43434
→1 Captures: 43434
["Other"] → [2]: ˽of˽
→2 Captures: ˽of˽
["Key"] → [3]: someword
→3 Captures: someword
Match #1
[0]: 12˽anything˽someword
["Value"] → [1]: 12
→1 Captures: 12
["Other"] → [2]: ˽anything˽
→2 Captures: ˽anything˽
["Key"] → [3]: someword
→3 Captures: someword
Match #2
[0]: 2323˽new˽someword
["Value"] → [1]: 2323
→1 Captures: 2323
["Other"] → [2]: ˽new˽
→2 Captures: ˽new˽
["Key"] → [3]: someword
→3 Captures: someword
視覚的にここに一致するものがあります: