私は正規表現の初心者であり、次のような重複する連続する単語に「一致」する単一の正規表現を記述する方法がよくわかりません。
春のパリ。
それが関係しているわけではありません。
なぜ笑っている?私の正規表現はそんなに悪いですか??
上記の太字の文字列すべてに一致する単一の正規表現はありますか?
私は正規表現の初心者であり、次のような重複する連続する単語に「一致」する単一の正規表現を記述する方法がよくわかりません。
春のパリ。
それが関係しているわけではありません。
なぜ笑っている?私の正規表現はそんなに悪いですか??
上記の太字の文字列すべてに一致する単一の正規表現はありますか?
この正規表現はより多くの状況を処理すると思います:
/(\b\S+\b)\s+\b\1\b/
テスト文字列の適切な選択は、http: //callumacrae.github.com/regex-tuesday/challenge1.htmlにあります。
以下のREでこれを試してください
()* もう一度繰り返す
public static void main(String[] args) {
String regex = "\\b(\\w+)(\\b\\W+\\b\\1\\b)*";// "/* Write a RegEx matching repeated words here. */";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE/* Insert the correct Pattern flag here.*/);
Scanner in = new Scanner(System.in);
int numSentences = Integer.parseInt(in.nextLine());
while (numSentences-- > 0) {
String input = in.nextLine();
Matcher m = p.matcher(input);
// Check for subsequences of input that match the compiled pattern
while (m.find()) {
input = input.replaceAll(m.group(0),m.group(1));
}
// Prints the modified sentence.
System.out.println(input);
}
in.close();
}
広く使用されている PCRE ライブラリは、このような状況を処理できます (ただし、POSIX 準拠の正規表現エンジンでは同じことはできません)。
(\b\w+\b)\W+\1
これは、twitch ボットで重複するフレーズを削除するために使用する正規表現です。
(\S+\s*)\1{2,}
(\S+\s*)
空白ではなく、空白の後に続く任意の文字列を探します。
\1{2,}
次に、一致する文字列内でそのフレーズのインスタンスが 2 つ以上検索されます。同一のフレーズが 3 つあれば一致します。
いいえ、それは不規則な文法です。使用できるエンジン/言語固有の正規表現があるかもしれませんが、それを行うことができる普遍的な正規表現はありません。
Javascript の例: 良い部分は、これを行うために適応させることができます:
var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+\1(?:\s|$)/gi;
\b は単語境界に \w を使用します。\w は [0-9A-Z_a-z] に相当します。その制限を気にしないのであれば、受け入れられた答えは問題ありません。
重複する単語の大文字と小文字を区別しないチェックが必要な場合に使用します。
(?i)\\b(\\w+)\\s+\\1\\b