どのように合わせた最初の単語の後に表現regex?
-
23-08-2019 - |
質問
例えば、このテキスト:
未稿dolor座amet,consectetur adipiscing elit.Nunc eu tellus vel nunc pretium lacinia.Proin sed lorem.Cra sedイプサム.Nunc、libero quis risus sollicitudin imperdiet.
い合わせの後イプサム'.
解決
この音のような仕事lookbehindsものを認識しておく必要があることのないすべての正規表現の味を支援します。おとえば:
(?<=\bipsum\s)(\w+)
これはあらゆるシークエンスにマッチ文字の文字の下にある"イプサム"全体としての単語の後にスペース。とまりん ない マッチ"イプサム"そんな心配をする必要がreinsertingこの場合、例えば換える。
しかし、ものの、一部のフレーバー(JavaScript)をサポートしないlookbehind。多くの他(ほう)のみサポート"の固定幅"lookbehindsできますがこの例では、繰り返します。(言い換えれば、 (?<=\b\w+\s+)(\w+)
な ます。)
他のヒント
他の応答者の一部は、lookbehindsに依存しない正規表現を使用して提案しているが、私は完全に、実施例は、全体のポイントを得るために必要とされると思います。アイデアは、あなたが興味のある部分を単離するために、キャプチャグループを使用し、その後、通常の方法でシーケンス全体(「イプサム」に加えて次の単語)と一致していることです。たとえばます:
String s = "Lorem ipsum dolor sit amet, consectetur " +
"adipiscing elit. Nunc eu tellus vel nunc pretium " +
"lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
"a libero quis risus sollicitudin imperdiet.";
Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
System.out.println(m.group(1));
}
これは、両方の「悲しみ」と「ヌンク」を印刷していることに注意してください。後読みのバージョンで、あなたのようなハック何かをしなければならないことを行うには:
Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");
これは明らかに、最大の長さを持つように後読みを必要とするJava、であります。いくつかのフレーバーも、それだけの柔軟性を持っていない、と当然のことながら、いくつかは、まったくlookbehindsをサポートしていません。
しかし、人々は彼らの例で持っているように見える最大の問題はlookbehindsではなく、単語の境界ではありません。デビッド・ケンプとCKの両方が「M」は次のスペース文字に一致するように\b
を期待しているように見えるが、それはしていません。それは の「M」と空間との間の位置(または境界)と一致します。
これはよくある間違い、私もいくつかの書籍やチュートリアルで繰り返し見てきた1が、ワード境界構造、\b
だ、任意の文字に一致することはありません。これは、前後参照し、アンカー(^
、$
、\z
、など)のように、ゼロ幅アサーションだ、とそれが一致すると、単語文字が先行し、1が続いていない、または単語文字が続くとされたいずれかの位置にあります1が先行していない。
イプサムB \(\ワット*)
javascript
を使用すると、
(?=ipsum.*?(\w+))
を使用することができます
これは、同様に第二の発生を取得する(Nunc社製)
イプサムB \(。*)\ bの
編集: あなたの正規表現の実装にもよるが、これは飢えてとイプサム
の後にすべての単語を見つけることができます