私はこのHTMLを持っています
<br />
<strong>Name:</strong> Josef
<br />
この場合、「ジョセフ」という名前を一致させたいと思います。正規表現で m を使用しない場合、Josef がその文字列の最後の単語であるため、いくつかの問題があります。私のアプローチ
^<strong>Name:</strong> (.*?)$
うまくいかないようですが、これはどのように正しく行われますか?
HTML 文字列に 2 つのリテラル改行があるように見える場合は、正規表現を複数行モードに$
設定end-of-line
して、end-of-string
.
html parser
代わりに使用する必要がありますregex
しかし、それでも必要な場合
できるよ
<strong>Name:</strong>\s*(\w+)
プレフィックスに続く位置を見つけるこの正規表現パターンを使用できます。
(?<=prefix)find
あなたの場合
(?<=^<strong>Name:</strong> ).*$
正確に "Josef" が検索され、グループを使用する必要はありません。ただし、 html を使用した検索には、 Html Agility Packの使用を検討してください。
複数行モードを使用してアンカーを正しく機能させる代わりに、アンカーを捨てます。
<strong>Name:</strong>\s*([^\r\n<]+)
HTML は行ベースの形式ではないため、行アンカーを使用してもあまり意味がありません。そのテキストの一部は、今日はそれ自体の行にあるかもしれませんが、明日は編集され、改行が削除される可能性があります。それでも有効な HTML であり、まったく同じようにレンダリングされます。
別の潜在的な問題は、改行が\r\n
単なる\n
. \r
.NET regex フレーバーは行区切り記号 (の一部) として認識しないため、 はと$
の間の位置に一致し、は名前 (つまり ) と共にキャプチャされます。\r
\n
\r
"Josef\r"
親愛なるマティアス・ヴァルトキルヒャーへ
2 つのソリューション:
1) 式を使用する:
"(?:^|\n)<strong>Name:</strong> (.*?)(?:$|\r)"
2) その他の表現:
"</strong>\s(.*?)(?:\r|$)"
両方のソリューションで、目的の一致は、一致オブジェクト match.Groups[1].Value のこの prop になります。
使用される MetaChars:
(?:) // unamed/unumered group;
\n // new line;
\r // carriage return;
^ // beginning of the input;
| // or
() // numered group,
$ // end of the input.
ご多幸をお祈り申し上げます。
心から、
ジョセフだけが必要な場合は、RightToLeft 正規表現オプションを使用して、パーサーに開始と終了のヒントを与え、開始に向かって動作しないようにしてください。パターンは依然として左から右であり、次のように変換されます。
string data =@"
<br />
<strong>Name:</strong> Josef
<br />
";
string pattern = @"\</strong\>\s+([^\r\n]+)";
// Put in | | to show no whitespace leakage.
Console.WriteLine ("|{0}|", Regex.Match(data, pattern, RegexOptions.RightToLeft).Groups[1].Value);
// Outputs
// |Josef|