1

.NETを使用して、文字列内の正の数と負の数(10進数または1000の区切り文字なし)を照合したいのですが、単語全体のみを照合したいと思います。したがって、文字列が次のようになっている場合

redeem: -1234
paid: 234432

次に、-1234と234432を一致させたい

しかし、テキストが

LS022-1234-5678
FA123245

その後、一致を返さないようにします。私は試した

\b\-?\d+\b

ただし、最初のシナリオでは1234にのみ一致し、「-」記号は返されません。

どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

1

スペースとの間に単語の境界がないため、そこで-使用することはできません\b

あなたが使用することができます:

(?<!\S)-?\d+\b

また

(?<![\w-])-?\d+\b

要件によって異なります(完全には指定されていません)。どちらもあなたの例で機能します。

于 2012-04-05T17:14:49.197 に答える
1

まあ、これは完璧にはほど遠いと思いますが、あなたの例ではうまくいきます:

(?<=\W)-?(?<!\w-)\d+

数字の直前にアンダースコアを許可する場合は、次の変更を使用します。

(?i)(?<=[^a-z0-9])-?(?<![a-z0-9]-)\d+

問題があれば教えてください。私がお手伝いします。どちらかを説明してほしい場合は、そのこともお知らせください。

編集

数字/負の符号の直前にスペースまたはタブがある場合にのみ一致させるには(以下のコメントに記載されているように)、これを使用できます。

(?<=[ \t])-?\d+

たとえば、電話番号、時刻、または日付の値の最初の番号シリーズと一致し、番号が行の先頭(改行の後)にある場合は一致しないことに注意してください-これが意図したものであることを確認してください:D

于 2012-04-05T17:31:27.140 に答える
0

オプションのパターンの前に、単語charがハイフンのすぐ左に表示される必要がある\b-?\d+\bため、パターンは間違っています。一般に、オプションのパターンの横に単語の境界を使用しないでください(もちろん何をしているのかを理解していない限り)。\b-?

-?\b\d+\b 数字を単語全体として一致123またはいいねするために使用-123する場合があります。ただし、ここでは、少し異なるものを探しています。これは、とが単語以外の文字(つまり、ハイフン)で囲まれているため、内部の単語全体であるためです。12345678LS022-1234-5678

この場合、\b左側の余分な後読みチェックを使用して、単語全体のマッチングを拡張する必要があります。

-?\b(?<!\d-)\d+\b

正規表現のデモを参照してください。詳細

  • -? -オプションのハイフン
  • \b-単語の境界
  • (?<!\d-)--現在の場所のすぐ左に数字+がある場合、一致に失敗するネガティブルックビハインド。
  • \d+-1つ以上の数字
  • \b-単語の境界。

C#デモを参照してください:

using System;
using System.Linq;
using System.Text.RegularExpressions;

public class Test
{
    public static void Main()
    {
        var text = "LS022-1234-5678, FA123245, redeem: -1234, paid: 234432";
        var matches = Regex.Matches(text, @"-?\b(?<!\d-)\d+\b").Cast<Match>().Select(x => x.Value).ToList();
        foreach (var s in matches)
            Console.WriteLine(s);
    }
}

出力:

-1234
234432
于 2022-02-19T17:55:52.570 に答える