如何在 Dart 中使用正则表达式?

在 Flutter 应用程序中,我需要检查字符串是否匹配特定的 RegEx。然而,我从应用程序 一直都是的 JavaScript 版本复制的 RegEx 在 Flutter 应用程序中返回 false。我在 Regexr上验证了正则表达式是有效的,而且这个正则表达式已经在 JavaScript 应用程序中使用了,所以它应该是正确的。

感谢你们的帮助!

正则表达式: /^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
167252 次浏览

我认为您已经尝试在原始表达式字符串中包含选项,而且已经将其作为 RegEx 的参数(/i 表示不区分大小写,声明为 caseSense: 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

对于未来的观众来说,这是一个更普遍的答案。

Regex in Dart works much like other languages. You use the RegExp class to define a matching pattern. Then use hasMatch() to test the pattern on a string.

例子

字母数字

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

Extracting text

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

参见: