2

私は正規表現の初心者です。

文字列の繰り返し文字を置き換えたい。ここにいくつかの例

$str1 = "aaa bbb cc dddd";  // output : a b c d

$str2 = "Google is the best";  // output : Google is the best

この質問に関連する多くの質問がstackoverflowで見つかりました。しかし、それは私の要件を満たしていません。

私はこれを試しまし(\w)\1たが、これは私の解決策ではありません

何か案が ?前もって感謝します

編集 :

その他の例

 $str1 = "this is tesaaat. are you ook?";  // output : this is tesaaat. are you ook?

 $str2 = "Good morning mmmm yyyy friendssss ";  // output : Good morning m y friends

 $str3 = "Hello friendd okk";  // output : Hello friend okk 

要するに、繰り返される文字とそれに続くスペースのみを置き換えたいと思います。

4

4 に答える 4

4

次の正規表現を使用できます: \b(\w)\1+\b.

説明:

  • 単語区切り ( \b)
  • 1文字
  • 繰り返し (少なくとも 1 回は同じ文字)
  • 再び、単語の区切り

編集:詳細については、最初の\b. したがって、次のようになります。(\w)\1+\b

于 2013-10-26T20:31:47.027 に答える
3

u次の正規表現は、 -unicode フラグを使用して任意の言語のすべての文字に対して機能します。

/([\p{L}\W])\1+(?= )/u

説明:

(                 # beginning of 1st capturing group
    [             # beginning of characters class
        \p{L}     # any letter from any language
        \W        # any non-word character
    ]             # end of character class
)                 # end of 1st capturing group
\1                # back reference to our 1st capturing group for repetition
+                 # one or more character repetition
(?= )             # using positive lookahead to be sure it's followed by a space

preg_replace仕事を達成するために使用:

$string = preg_replace("/([\p{L}\W])\1+(?= )/u", "$1", $string);

あなたの例の出力:

"aaa bbb cc dddd "  =>  "a b c d "
"Google is the best"  =>  "Google is the best"
"this is tesaaat. are you ook?"  =>  "this is tesaaat. are you ook?"
"Good morning mmmm yyyy friendssss "  =>  "Good morning m y friends "
"Hello friendd okk"  =>  "Hello friend okk"

ライブデモ

于 2013-10-27T07:48:11.237 に答える
1

次のようなものを試してください:

preg_replace('/(\b)(\w)\2+(\b)/', '$2', $string);
于 2013-10-26T20:46:03.417 に答える
1
$text = "aaa bbb cc dddd";
$replacedText = preg_replace('{(\w)\1+}','$1',$text);

繰り返しの空白も必要ない場合は、次のことを試してください。

$replacedText = preg_replace('{(.)\1+}','$1',$text);
于 2013-10-26T20:41:04.210 に答える