たとえば、このテキストでは:
Lorem ipsum dolorはamet、consectetur adipiscingエリートに座ります。 Nunc eu tellus vel nunc pretium lacinia。 Proin sed lorem。 Cras sed ipsum。リベロquis risus sollicitudin imperdietを無効にします。
「イプサム」の後の単語に一致させたい。
これは後読みの仕事のように聞こえますが、すべての正規表現フレーバーがそれらをサポートしているわけではないことに注意してください。あなたの例では:
(?<=\bipsum\s)(\w+)
これは、単語全体としてスペースが続く「ipsum」に続く文字文字のシーケンスと一致します。 notは「ipsum」自体と一致します。たとえば、次のような場合に再挿入することを心配する必要はありません。交換。
ただし、前述のように、一部のフレーバー(JavaScriptなど)は後読みをまったくサポートしていません。他の多く(実際にはほとんど)は「固定幅」後読みのみをサポートしているため、この例は使用できますが、繰り返し演算子は使用できません。 (言い換えると、 (?<=\b\w+\s+)(\w+)
は機能しません。)
他のレスポンダーの一部は、後読みに依存しない正規表現を使用することを提案していますが、全体を理解するには、完全で実用的な例が必要だと思います。アイデアは、通常の方法でシーケンス全体( "ipsum"と次のWord)を照合し、次にキャプチャグループを使用して興味のある部分を分離することです。例えば:
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));
}
これは「dolor」と「Nunc」の両方を印刷することに注意してください。後読みバージョンでこれを行うには、次のようなハックをする必要があります。
Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");
これはJavaでのことで、後読みには明らかな最大長が必要です。一部のフレーバーは、それほど多くの柔軟性さえありません。もちろん、一部のフレーバーは後読みをまったくサポートしていません。
しかし、人々が彼らの例で抱えているように見える最大の問題は、後読みではなく、Wordの境界にあります。 David Kempとckはどちらも\b
が「m」に続くスペース文字と一致することを期待しているようですが、一致しません。位置(または境界)間 'm'とスペースに一致します。
これはよくある間違いで、いくつかの本やチュートリアルで繰り返し見たものですが、Wordの境界構造\b
はどの文字とも一致しません。これは、ルックアラウンドやアンカー(^
、$
、\z
など)のようなゼロ幅のアサーションであり、一致するのは、Word文字と後に1つ、またはWord文字が続き、前に1つは付きません。
ipsum\b(\ w *)
javascript
を使用すると、(?=ipsum.*?(\w+))
これも2番目のオカレンスを取得します(Nunc)