4

迅速な正規表現の問題 (願っています)。

正規表現に基づいて、任意の文字列から部分文字列を識別する必要があります。

たとえば、次の文字列を使用します。

"Blogs, Joe (S0003-000292).html"
"bla bla bla S0003-000292 & so on"
"RE: S0003-000292"

「S0003-000292」の部分を抽出する必要があります (または、見つからない場合は例外にフラグを立てます)。

私が試したことに関しては、まあ、S0000-000000を識別するための大まかなパターンを書きました:

^\(S[0-9]{4}-[0-9]{6}\)$

そして、次のようにテストしてみました:

Dim regex As New Regex("Blogs, Joe (S0003-000292) Lorem Ipsum!")
Dim match As Match = regex.Match("^S[0-9]{4}-[0-9]{6}$")

If match.Success Then
    console.writeline "Found: " & match.Value
Else
    console.writeline "Not Found"
End If

ただし、これは常に Not Found になります。

では、実際に 2 つの質問があります。私のパターンの何が問題なのか、修正されたパターンを使用して部分文字列を抽出するにはどうすればよいでしょうか。

(.net 2 での作業)

編集: stema は正しい方向に私を指摘しました (つまり、^ と $ を削除する)-しかし、それは問題を解決しませんでした。私の主な問題は、パターンの代わりに RegEx コンストラクターで文字列を定義したことでした-これらを交換し、それはうまくいきました(私はカフェインの不足を非難します):

Dim regex As New Regex("S[0-9]{4}-[0-9]{6}")
Dim match As Match = regex.Match("Joe, Blogs (S0003-000292).html")

If match.Success = True Then
    console.writeline "Found: " & match.Value
Else
    console.writeline "Not Found"
End If
4

3 に答える 3

7

パターンの一致を妨げるアンカーが配置されています

^\(S[0-9]{4}-[0-9]{6}\)$
^                      ^

^文字列の先頭に一致しています

$文字列の末尾に一致しています

合わせたい部分の前後に他のものがあるため、パターンは一致しません。それらのアンカーを削除するだけで問題ありません。

または、代わりに単語境界を使用します

\bS[0-9]{4}-[0-9]{6}\b

\bパターンの前後に「単語以外」の文字 (文字や数字以外) がある場合に一致します。

于 2012-04-26T11:57:56.897 に答える
0

ここに役立つコードがあります注:私はc#で書きました

Regex reg  = new Regex("(.)*S[0-9]{4}-[0-9]{6}(.)*");
string str = "Blogs, Joe (S0003-000292) Lorem Ipsum!";
Console.WriteLine(reg.IsMatch(str));
Console.ReadLine();
于 2012-04-26T12:03:04.823 に答える
0
Dim reg as new Regex("(.)*S[0-9]{4}-[0-9]{6}(.)*")
Dim str as new string("Blogs, Joe (S0003-000292) Lorem Ipsum!")
MessageBox.show(reg.IsMatch(str))


I am not sure about syntax but this may be a right conversion of my c# code.
于 2012-04-26T12:10:23.110 に答える