5

元の質問が削除されました


特殊文字、文字、数字を含む文字列を数字のみを含む文字列にフォーマットする正規表現を探しています。すべての非数値文字を "" (空) に置き換えるだけでは不十分な特殊なケースがあります。

1.) 括弧内はゼロ。

  • 角かっこ (0) にゼロしかない場合、それが最初の角かっこのペアであれば、これらを削除する必要があります。(ゼロのみを含む 2 番目のブラケット ペアは削除しないでください)

2.) 先行ゼロ。

  • 先頭のゼロはすべて削除する必要があります (括弧は無視)

理解を深めるための例:

  • 123 (0) 123 would be 123123 (zero removed)
  • (0) 123 -123 would be 123123(zero and all other non-numeric characters removed)
  • 2(0) 123 (0) would be 21230 (first zero in brackets removed)
  • 20(0)123023(0) would be 201230230 (first zero in brackets removed)
  • 00(0)1 would be 1(leading zeros removed)
  • 001(1)(0) would be 110 (leading zeros removed)
  • 0(0)02(0) would be 20 (leading zeros removed)
  • 123(1)3 would be 12313 (characters removed)
4

4 に答える 4

5

後読み を使用して、文字列の先頭にない場合にのみ一致(0)させ、実行中に空の文字列に置き換えることができます。

(元のソリューションが削除されました)


新しい要件を反映するために再度更新されました

先行ゼロに一致(0)し、それが最初の括弧で囲まれた項目である場合にのみ一致し、数字以外の文字に一致します。

^[0\D]+|(?<=^[^(]*)\(0\)|\D

ほとんどの正規表現エンジンは可変長のルックビハインド(つまり、のような数量詞の使用*)をサポートしていないため、これは少数の正規表現エンジンでのみ機能します。.NETはその1つです。

^[0\D]+      # zeroes and non-digits at start of string
|            # or
(?<=^[^(]*)  # preceded by start of string and only non-"(" chars
\(0\)        # "(0)"
|            # or
\D           # non-digit, equivalent to "[^\d]"

regexhero.netでテスト済み


要件を数回変更および追加しました。このような複数のルールの場合、それらを個別にコーディングすることをお勧めします。ある条件が一致し、別の条件が一致しない場合、デバッグが複雑になり、困難になる可能性があります。たとえば、別の手順で:

  1. 必要に応じて括弧内の項目を削除してください。
  2. 数字以外の文字を削除します。
  3. 先行ゼロを削除します。

ただし、これら3つの条件をすべて1つの正規表現で一致させる必要がある場合(非推奨)、ここにあります。

于 2013-03-06T15:03:42.130 に答える
1

この正規表現は、探している正規表現にかなり近いはずです。

(^[^\d])|([^\d](0[^\d])?)+

(空の文字列でキャッチされたものはすべて置き換えることができます)

編集 :

あなたの要求は進化し、今では複雑になり、1回のパスで処理されます。ブラケットグループの前に常にスペースがあると仮定すると、それらのパスを使用できます(この順序を維持してください):

string[] entries = new string[7] {
    "800 (0) 123 - 1",
    "800 (1) 123",
    "(0)321 123",
    "1 (0) 1",
    "1 (12) (0) 1",
    "1 (0) (0) 1",
    "(9)156 (1) (0)"
};
foreach (string entry in entries)
{
    var output = Regex.Replace(entry , @"\(0\)\s*\(0\)", "0");
    output = Regex.Replace(output, @"\s\(0\)", "");
    output = Regex.Replace(output, @"[^\d]", "");
    System.Console.WriteLine("---");
    System.Console.WriteLine(entry);
    System.Console.WriteLine(output);
}
于 2013-03-06T15:01:36.050 に答える
1

複数のパスを使用できる場合、正規表現ははるかに簡単になります。(0) が文字列の最初のものでない場合は、最初のパスを実行して (0) を削除し、続いて数字以外を削除できると思います。

var noMidStrParenZero = Regex.Replace(text, "^([^(]+)\(0\)", "$1");
var finalStr = Regex.Replace(noMidStrParenZero, "[^0-9]", "");

多くの正規表現の狂気を回避し、ある程度自己文書化しています。

編集: このバージョンは、新しい例でも動作するはずです。

于 2013-03-06T15:09:32.973 に答える
0
(?:     # start grouping
    ^   # start of string
    |   # OR
    ^\( # start of string followed by paren
    |   # OR
    \d  # a digit
)       # end grouping
(0+)    # capture any number of zeros
|       # OR
([1-9]) # capture any non-zero digit

これはすべての例の文字列で機能します(が、式全体が に続くゼロに一致します。を使用Regex.Matchesして、グローバル マッチを使用してマッチ コレクションを取得し、一致したすべてのグループを文字列に結合して、数値のみを取得できます (または非数値を削除するだけです)。

于 2013-03-06T15:10:33.997 に答える