Как использовать RegEx в Dart?

В приложении Flutter мне нужно проверить, соответствует ли строка определенному RegEx. Тем не менее, RegEx, который я скопировал из версии JavaScript, приложение всегда возвращает false в приложении Flutter. Я проверил в regexr, что RegEx действителен, и этот самый RegEx уже используется в приложении JavaScript, поэтому он должен быть правильным.

Любая помощь приветствуется!

/^WS{1,2}:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:56789/i: /^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

Ответы

Ответ 1

Я думаю, вы пытались включить опции в строку выражения выражения, пока у вас уже есть параметры для 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

Ответ 2

Это более общий ответ для будущих зрителей.

Regex в Dart работает так же, как и другие языки. Вы используете класс RegExp, чтобы определить соответствующий шаблон. Затем используйте hasMatch() для проверки шаблона на строке.

Примеры

Буквенно-

final alphanumeric = RegExp(r'^[a-zA-Z0-9]+$');
alphanumeric.hasMatch('abc123');  // true
alphanumeric.hasMatch('abc123%'); // false

шестнадцатеричные цвета

RegExp hexColor = RegExp(r'^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$');
hexColor.hasMatch('#3b5');     // true
hexColor.hasMatch('#FF7723');  // true
hexColor.hasMatch('#000000z'); // false

Извлечение текста

final myString = '25F8..25FF    ; Common # Sm   [8] UPPER LEFT TRIANGLE';

// find a variable length hex value at the beginning of the line
final regexp = RegExp(r'^[0-9a-fA-F]+'); 

// find the first match though you could also do 'allMatches'
final match = regexp.firstMatch(myString);

// group(0) is the full matched text
// if your regex had groups (using parentheses) then you could get the 
// text from them by using group(1), group(2), etc.
final matchedText = match.group(0);  // 25F8

Здесь есть еще несколько примеров here.