7

以下のテストファイル名があります:

abc001_20111104_summary_123.txt
abc008_200700953_timeline.txt
abc008_20080402_summary200201573unitf.txt
123456.txt
100101-100102 test.txt
abc008_20110902_summary200110254.txt
abcd 200601141 summary.txt
abc008_summary_200502169_xyz.txt

各ファイル名から 番号を抽出する必要があります。

番号は6 桁、7 桁、9 桁、または 10 桁でなければなりません(つまり、 8 桁の数字を除く)。

複数が見つかった場合 は最初の番号を取得し、見つからない場合は空の文字列を取得します。

最初に 8 桁の数字を削除し、次にリストから 6 ~ 10 桁の数字を抽出するという2 段階のプロセスでこれを行うことができました。

step 1 
  regex:  ([^0-9])([0-9]{8})([^0-9])
  replacement:  \1\3

step 2
  regex: (.*?)([1-9]([0-9]{5,6}|[0-9]{8,9}))([^0-9].*)
  replacement:  \2

この 2 ステップのプロセスの後に得られる数値は、まさに私が探しているものです。

[]
[200700953]
[200201573]
[123456]
[100101]
[200110254]
[200601141]
[200502169]

ここで問題は、 これを 1 ステップのプロセスで行う方法はあるのかということです。

同様の質問に対するこの素晴らしい解決策を見てきましたが、複数見つかった場合は最新の番号が表示されます。

注: The Regex Coachでテストしています。

4

4 に答える 4

8

正規表現エンジンが後読みアサーションをサポートしていると仮定します。

(?<!\d)\d{6}(?:\d?|\d{3,4})(?!\d)

説明:

(?<!\d)   # Assert that the previous character (if any) isn't a digit
\d{6}     # Match 6 digits
(?:       # Either match
 \d?      # 0 or 1 digits
|         # or
 \d{3,4}  # 3 or 4 digits
)         # End of alternation
(?!\d)    # Assert that the next character (if any) isn't a digit
于 2012-07-30T13:35:27.070 に答える
0

これを試して:

regex: /(?:^|\D)(\d{6}(?:\d(?:\d{2,3})?)?)(?:\D|$)/
replacement: \1

これにより、6桁が抽出され、オプションでさらに1つ(合計7つ)、オプションでさらに2つまたは3つ(9または10)が続きます。

于 2012-07-30T13:42:15.330 に答える
0

すべての文字列 $subject

$subject = "abc001_20111104_summary_123.txt";
$subject ="abc008_200700953_timeline.txt";
$subject ="abc008_20080402_summary200201573unitf.txt";
$subject ="123456.txt"
$subject ="100101-100102 test.txt"
$subject ="abc008_20110902_summary200110254.txt";
$subject ="abcd 200601141 summary.txt";
$subject ="abc008_summary_200502169_xyz.txt";

$pattern = '*(?<!\d)(\d{6,7}|\d{9,10})(?!\d)*';
preg_match_all($pattern, $subject, $matches);
print_r($matches);

期待される結果が得られます。

  • 空の
  • 200700953
  • 200201573
  • 123456
  • 100101
  • 200110254
  • 200601141
  • 200502169
于 2012-07-30T13:44:29.397 に答える
0

の端にある単語境界または非数値を一致させると、次の[0-9]{6,7}|[0-9]{9,10}ようになります。

([^0-9]|\<)([0-9]{6,7}|[0-9]{9,10})([^0-9]|\>)
于 2012-07-30T14:02:13.743 に答える