1. ホーム
  2. regex

[解決済み] DartでRegExを使うには?

2022-02-03 21:12:22

質問

Flutterアプリケーションで、ある文字列が特定のRegExにマッチするかどうかをチェックする必要があります。しかし、JavaScript版のアプリからコピーしたRegExは 常に はFlutterアプリでfalseを返します。検証したのは レジェックサー が有効であることを確認し、まさにこの RegEx は JavaScript アプリケーションですでに使用されているため、正しいはずです。

どんなことでもご相談ください。

RegEx: /^WS{1,2}:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:56789/i

テストコード:

RegExp regExp = new RegExp(
  r"/^WS{1,2}:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:56789/i",
  caseSensitive: false,
  multiLine: false,
);
print("allMatches : "+regExp.allMatches("WS://127.0.0.1:56789").toString());
print("firstMatch : "+regExp.firstMatch("WS://127.0.0.1:56789").toString());
print("hasMatch : "+regExp.hasMatch("WS://127.0.0.1:56789").toString());
print("stringMatch : "+regExp.stringMatch("WS://127.0.0.1:56789").toString());

出力:

allMatches : ()
firstMatch : null
hasMatch : false
stringMatch : null

解決方法は?

RegEx のパラメータとしてすでに持っているオプションを、生の式の文字列に含めようとしたのだと思います (/i は caseSensitive: false として宣言されています)。

// Removed /i at the end
// Removed / in front - Thanks to Günter for warning
RegExp regExp = new RegExp(
  r"^WS{1,2}:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:56789",
  caseSensitive: false,
  multiLine: false,
);
print("allMatches : "+regExp.allMatches("WS://127.0.0.1:56789").toString());
print("firstMatch : "+regExp.firstMatch("WS://127.0.0.1:56789").toString());
print("hasMatch : "+regExp.hasMatch("WS://127.0.0.1:56789").toString());
print("stringMatch : "+regExp.stringMatch("WS://127.0.0.1:56789").toString());

与える。

allMatches : (Instance of '_MatchImplementation')
firstMatch : Instance of '_MatchImplementation'
hasMatch : true
stringMatch : WS://127.0.0.1:56789