C#で正規表現を使用して特定の単語の前の数字を取得するにはどうすればよいですか?


10

以下の正規表現を使用して、単語の前の数字を取得します。

例:

838123 someWord 8 someWord 12 someWord

(\d+)\s*someWord

ただし、Numberとwordの間に何かが発生する場合があります。以下のサンプル行を参照してください。

例:

43434 of someword 12何かsomeword 2323新しいsomeword

正規表現を使用してその単語の前の正確な数字を取得するにはどうすればよいですか?

あなたの提案をお願いします。


3
既存の投稿があなたの質問に答えているようです。回答が役に立ったら、回答者と将来の読者に知らせてください(ツアーに参加してください)。それ以外の場合は、探している情報と回答があなたのケースに適さない理由について詳しく説明してください。
Reza Aghaei

1
何を求めているのかわからない...
JohnyL

回答:


14

これを行う:

(\d+)[^\d]+some[wW]ord

数字以外のものを受け入れる必要があります。また、私は両方と考えるwW、あなたの例では、両方が含まれているため。

デモ


別の答えを探していますか?
Reza Aghaei

@RezaAghaei多分
CinCout

あなたが提供した現在の答えの問題は何ですか?どのような改善を求めていますか?
Reza Aghaei

@RezaAghaei OPがまだ答えを受け入れていないという事実は、私がコーナーケースか何かを逃したかどうかを私に考えさせます。それを解決する別のアプローチも歓迎します。
CinCout

1
@ CinCout-ReinstateMonica 可能性のある逃したエッジのケースについては私の回答を参照しください(これがOPに関連しているかどうかは不明です)。
スティーブチェンバーズ


3

一致があればCinCoutの答えから、一つの可能な「見逃しコーナーケース」であるsomeWord場合など、正確でなければならないnotsomeWordsomeWordNotThis一致させるべきではありません。

その正規表現への次の拡張は、これに対処する方法を提供します。

(\d+)[^\d]*[^\w]some[wW]ord[^\w]

説明:[^\w]ため、整合の前または後someWordのために見て、「非単語文字」前と後-ラインの終わりにも、ここでカウントします。もちろん、これは正確な要件に応じて、より複雑/特定にすることができます。

デモ


3

あなたはこのようなものを試すことができます:

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

ここでテストを見ることができます


3

最初の分離some[wW]ordnumber及び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


2

ただし、Numberとwordの間に何かが発生する場合があります。以下のサンプル行を参照してください。

例:

43434 of someword 12何かsomeword 2323新しいsomeword

これを試して

(\ d +)(。*?)someword

説明した

\ d +-数値

。*?-数字の後にあるものを除いて、最小出現数。

someword-やや完全一致

デモ


2

を使用\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 正規表現のデモを見る


2

名前付きマッチキャプチャを使用して(データを取得するには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

視覚的にここに一致するものがあります:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.