これはクラックするトリッキーな挑戦のビットでした! ...しかし、私はそれを得た。ネガティブなルックアラウンドを使用すると、不要な部分文字列を無効にすることができませんでした。 (*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.'
すべての単語は大文字で始まりますか? –
はい!たとえば、大文字で始まり、大文字または小文字、大文字で始まる単語。例。 'ArrayFunction'または' arrayFunction' – John