1

私はこのHTMLを持っています

<br />
<strong>Name:</strong> Josef
<br />

この場合、「ジョセフ」という名前を一致させたいと思います。正規表現で m を使用しない場合、Josef がその文字列の最後の単語であるため、いくつかの問題があります。私のアプローチ

^<strong>Name:</strong> (.*?)$

うまくいかないようですが、これはどのように正しく行われますか?

4

6 に答える 6

2

HTML 文字列に 2 つのリテラル改行があるように見える場合は、正規表現を複数行モード$設定end-of-lineして、end-of-string.

于 2012-12-13T16:13:59.677 に答える
0

html parser代わりに使用する必要がありますregex


しかし、それでも必要な場合

できるよ

<strong>Name:</strong>\s*(\w+)
于 2012-12-13T16:01:35.810 に答える
0

プレフィックスに続く位置を見つけるこの正規表現パターンを使用できます。

(?<=prefix)find

あなたの場合

(?<=^<strong>Name:</strong> ).*$

正確に "Josef" が検索され、グループを使用する必要はありません。ただし、 html を使用した検索には、 Html Agility Packの使用を検討してください。

于 2012-12-13T22:03:29.637 に答える
0

複数行モードを使用してアンカーを正しく機能させる代わりに、アンカーを捨てます。

<strong>Name:</strong>\s*([^\r\n<]+)

HTML は行ベースの形式ではないため、行アンカーを使用してもあまり意味がありません。そのテキストの一部は、今日はそれ自体の行にあるかもしれませんが、明日は編集され、改行が削除される可能性があります。それでも有効な HTML であり、まったく同じようにレンダリングされます。

別の潜在的な問題は、改行が\r\n単なる\n. \r.NET regex フレーバーは行区切り記号 (の一部) として認識しないため、 はと$の間の位置に一致し、は名前 (つまり ) と共にキャプチャされます。\r\n\r"Josef\r"

于 2012-12-13T22:47:27.260 に答える
0

親愛なるマティアス・ヴァルトキルヒャーへ

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.

ご多幸をお祈り申し上げます。

心から、

于 2012-12-13T20:47:28.340 に答える
0

ジョセフだけが必要な場合は、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|
于 2012-12-13T22:07:23.297 に答える