2017-10-24 8 views
0

テキスト内の単語が誤った形式で結合されている場合、どのように削除できますか。どのように削除正規表現を使用してテキスト内の不正な結合された単語にスペースを追加しますか?

 
HelloEveryOne, СаломБаХама, Ҳама дарПеши ҷаҳонЯк мебошадАммо. 
HELLOeveryOneHelloFORyouYOU HELLO everyOneHello FORyouYOU 
canBEcorrectedThisSTRINGinCorrectlyFORm 
canBEcorrected ThisSTRINGin CorrectlyFORm 
 
Hello Every One, Салом Ба Хама, Ҳама дар Пеши ҷаҳон Як мебошад Аммо. 
HELLO every One Hello FOR you YOU HELLO every One Hello FOR you YOU 
can BE corrected This STRING in Correctly FOR m 
can BE corrected This STRING in Correctly FOR m 

おかげで進める:たとえば、私はこのテキストを持っています!私はこのロケールを認識しません

+0

すべての単語は大文字で始まりますか? –

+0

はい!たとえば、大文字で始まり、大文字または小文字、大文字で始まる単語。例。 'ArrayFunction'または' arrayFunction' – John

答えて

-2

ので、私はこれらの奇妙な文字をテストすることができませんでしたが、最初の文字列は、これを解決することができます:

<?php 

$str = 'HelloEveryOne'; 
$newStr = ''; 

for ($i = 0; $i < strlen($str); $i++) { 
    $newStr .= ctype_upper($str[$i]) ? ' ' : ''; 
    $newStr .= $str[$i]; 
} 

echo $newStr; 

ctype_upper関数が返すの文字列は、すべての文字がある場合大文字で私は一度に1つの文字を渡すので、大文字であれば、プログラムはcharの前にスペースを追加します。

+0

答えに感謝します。しかし、私は1つの単語にではなく、テキストに使う必要があります。私は 'preg_replace()'で結果を得なければなりません@Vinicius Dias – John

+0

これは複数の仕事@Johnのために働きます。正しいロケールを設定するだけです。 –

2

unicode metacharactersを使用すると、大文字と小文字を検索できます。

\B(\p{Lu}[\p{Ll}.,!]+) 

\1 

正規表現のデモで置き換えます:

$string = 'HelloEveryOne, СаломБаХама, Ҳама дарПеши ҷаҳонЯк мебошадАммо.'; 
echo preg_replace('/\B(\p{Lu}[\p{Ll}.,!]+)/u', ' \1', $string); 

デモ:https://3v4l.org/ZjHh4

それはとして使用することができますPHPで https://regex101.com/r/QskwDd/2/

ような何か

もっと簡単なアプローチは、大文字を探してスペースを追加するだけです。

\B\p{Lu} 

と交換してください:

\0 

正規表現のデモ:https://regex101.com/r/QskwDd/1/

+0

@ chris85に答えるために+1が、私のために少し間違って動作します。例えば、私はサンプルテキストを入力しました: 'HElloEveryBody inINCORRECT ORTHESTEXT'その瞬間に結果を得る必要があります。そういう場合、' HE llo Every Body in INCORRECT OR TEXT'のように、右に大きな文字を追加する必要があります左は小文字、小文字は左の小文字です。大文字と小文字が混在している場所にスペースを追加する必要があります – John

+0

もう一つの例文: 'SimPleTEXTor HyperTexTmarkUPlanguAg'シンプルな結果を得るには:' Sim Ple TEXTやHyper Tex Tmark UP langu Ag'あるいはこれはできませんか? @ chris85 – John

+0

@Johnもう少し難しくなっています。5つのサンプル文字列、期待される結果、およびルールの定義で質問を更新できますか?元来のルールは、大文字で区切ることでした。 – chris85

1

これはクラックするトリッキーな挑戦のビットでした! ...しかし、私はそれを得た。ネガティブなルックアラウンドを使用すると、不要な部分文字列を無効にすることができませんでした。 (*SKIP)(*FAIL)技術がその仕事をしました。

論理はすべて、スペーシングに関係なく3種類の単語をターゲットにすることです。彼らは以下のとおりです。

  • 小文字
  • タイトル文字
  • すべて大文字

素人のパターンの説明のためのPHPコードブロックのインラインコメントを参照してください。

パターン:Demo

/(?:\p{Ll}+|\p{Lu}\p{Ll}+|\p{Lu}{2,}+)[,.!?]?(?:\s|$)(*SKIP)(*FAIL)|(?:\p{Ll}+|\p{Lu}{2,}+|\p{Lu}\p{Ll}+)[,.!?]?/u 

コード:(Demo

$input='HelloEveryOne, СаломБаХама, Ҳама дарПеши ҷаҳонЯк мебошадАммо. 
HELLOeveryOneHelloFORyouYOU HELLO everyOneHello FORyouYOU 
can,BEcorrectedThisSTRINGinCorrectlyFORm 
canBEcorrected ThisSTRINGin CorrectlyFORm.'; 

//        optional trailing punctuation-vvvv  vvvv- white space or end of input (that we don't want to replace) 
var_export(preg_replace('/(?:\p{Ll}+|\p{Lu}\p{Ll}+|\p{Lu}{2,}+)[,.!?]?(?:\s|$)(*SKIP)(*FAIL)|(?:\p{Ll}+|\p{Lu}{2,}+|\p{Lu}\p{Ll}+)[,.!?]?/u','$0 ',$input)); 
//     all lower-^^^^^^^    ^^^^^^^^^^^-all upper      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-repeat first alternative without trailing white space or end of input 
//   one upper then all lower-^^^^^^^^^^^^^       ^^^^^^^^^^^^^^-discard these matches 

出力:

'Hello Every One, Салом Ба Хама, Ҳама дар Пеши ҷаҳон Як мебошад Аммо. 
HELLO every One Hello FOR you YOU HELLO every One Hello FOR you YOU 
can, BE corrected This STRING in Correctly FOR m 
can BE corrected This STRING in Correctly FOR m.' 
+1

ああ、トリッキー。うまくいった。 – chris85

+0

@Johnはあなたの実際のプロジェクトでこの作業を行いましたか? – mickmackusa

関連する問題