最初に、 Expressoで提供した式を試し、次にLinqPadで試しました。どちらも、意図したものとは異なる文字列全体を返しました。目的の結果が表示されない理由は2つあります。
- 正規表現自体
- サンプル文字列の問題(タグはペアワイズではありません。つまり、それぞれ
<pre>
をで閉じる必要があります</pre>
)
それ以外に、コードにいくつかの改善を提案します。
- マッチングの方法を変更します(以下の例では正規表現オプションを使用し、グループ化を許可しています)
- tagNameをパラメーターとして追加し、パラメーターを追加してタグの包含または除外を許可します
- カウント値の代わりにコレクションを返す
コードを見てください。正常に動作します(デバッグ用に値を出力する場合に備えて、 LinqPadにオプションのコメントアウトされた.Dump()
ステートメントをいくつか追加しました)。
Public Function FindCode(input As String, tagName as string, includeTags as boolean)
Const grpName as string = "pregroup"
Dim pattern As String = "(<"+tagName+">)(?<"+grpName+">(\s|\w|')+)(</"+tagName+">)"
Dim output As New Dictionary(Of Integer, String)
Dim count As Integer
Dim options as RegexOptions = RegexOptions.IgnoreCase _
or RegexOptions.IgnorePatternWhitespace _
or RegexOptions.MultiLine or RegexOptions.ExplicitCapture
' options.Dump("options")
Dim rx as Regex = new Regex(pattern, options)
For Each m As Match In rx.Matches(input)
Dim val as string=nothing
if (includeTags)
val = m.Value
else
if(m.Groups(grpName).Success)
val = m.Groups(grpName).Value
end if
end if
if not (val is nothing)
' val.Dump("Found #" & count+1)
output.Add(count, val)
count += 1
end if
Next
Return output
End Function
表現について:
(\s|\w)+
の代わりに使用し.+
ています。これは、空白と英数字のみが含まれ、角かっこは含まれないため、タグは含まれないためです。
- (nnは文字の16進コード)を使用して、正規表現構文の特殊文字と競合する文字をエスケープします
\xnn
-注:これはここでは適用されません
- グループ名を使用して、タグのコンテンツに簡単にアクセスします
Regex
コードについて:includeTags
違いがわかるようにパラメーターを追加しました(false
それらを除外し、それらをtrue
含めます)。式の照合方法に影響するため、RegexOptionsは常に適切に設定する必要があることに注意してください。
最後に、メインコードは次のとおりです。
Sub Main
dim input as string = "Some random markup <pre> and this stuff in the middle is what I'm after </pre> and there <pre> lots of these in one file </pre> which when I use Regexhero <pre> finds all the tags </pre>"
dim result = FindCode(input, "pre", false)
dim count as integer = result.Count()
Console.WriteLine(string.Format("Found string {0} times.", count))
Console.WriteLine("Findings:")
for each s in result
Console.WriteLine(string.format("'{0}'", s.Value))
next
End Sub
これは出力します:
文字列が2回見つかりました。
調査結果:
'これらの多くを1つのファイルに'
'すべてのタグを検索します'
ただし、まだ1つの質問が残っています。最初に<pre>...</pre>
一致しないのはなぜですか。部分文字列を見てください。空白でも英数字でもないため、一致しない部分文字列I'm after
が含まれています。正規表現で'
指定することで追加でき、 3つの文字列すべてが表示されます。(\s|\w|')