4

これは魅力的なデバッグ体験でした。次の 2 行の違いがわかりますか?

StringReplace["–", RegularExpression@"[\\s\\S]" -> "abc"]
StringReplace["-", RegularExpression@"[\\s\\S]" -> "abc"]

あなたがそれらを評価するとき、それらは非常に異なることをします。これは、最初の行で置換されている文字列が、2 行目の単純な古い ascii ダッシュではなく、Unicode en ダッシュで構成されているためであることが判明しました。

Unicode 文字列の場合、正規表現が一致しません。正規表現 "[\s\S]" は「任意の文字 (改行を含む) に一致する」という意味ですが、Mathematica は明らかに「任意のASCII文字に一致する」として扱います。

上記の最初の行が 2 行目と同じように評価されるように正規表現を修正するにはどうすればよいですか? または、最初に文字列に適用できる asciify フィルターはありますか?

PS: Mathematica のドキュメントによると、その文字列パターン マッチングは Perl 互換の正規表現ライブラリ ( http://pcre.org ) の上に構築されているため、私が抱えている問題は Mathematica に固有のものではない可能性があります。

4

3 に答える 3

3

最初に回避策として使用した asciify 関数を次に示します。

f[s_String] := s
f[x_] := FromCharacterCode[x]

asciify[s_String] := 
  StringJoin[f /@ (ToCharacterCode[s] /. x_?(#>255&) :> "&"<>ToString[x]<>";")]

それから、@Isaacの答えのおかげで、「。」正規表現にはこのユニコードの問題がないようです。Bug in Mathematica: regular expression applied to very long string への回答から、"(.|\n)" はお勧めできませんが、"(?s)" であることを学びました。がおすすめ。したがって、最善の修正は次のとおりだと思います。

StringReplace["–", RegularExpression@"(?s)." -> "abc"]
于 2010-03-25T02:41:53.790 に答える
3

StringExpressionの代わりにa を使用しRegularExpressionます。これは希望どおりに機能します。

f[s_String] := StringReplace[s, _ -> "abc"]

では、StringExpressionASCIIBlank[]以外の文字を含むすべてのものと一致します。

バージョンの更新に応じて編集: Mathematica 11.0.1 の時点で、文字コード2^16 - 1( の最大値として呼び出されますFromCharacterCode) までの文字のように見えますが、 の結果は の結果とStringMatchQ[LetterCharacter]一致するようになりLetterQました。

AllTrue[FromCharacterCode /@ Range[2^16 - 1], 
 LetterQ@# === StringMatchQ[#, LetterCharacter] &]
(* True *)
于 2010-03-26T15:10:08.357 に答える
1

正規表現への入力に使用"(.|\n)"することは私にとってはうまくいくようです。パターンは.(改行文字以外の文字)または\n(改行文字)と一致します。

于 2010-03-25T03:51:26.040 に答える