Regex 在以省道中的撇号开始和结束的正则表达式字符串中转义撇号

Regex 在以省道中的撇号开始和结束的正则表达式字符串中转义撇号,regex,dart,Regex,Dart,我正在尝试为电子邮件地址创建正则表达式匹配,并打算在dart应用程序中使用它 我为此找到了以下正则表达式: (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z

我正在尝试为电子邮件地址创建正则表达式匹配,并打算在dart应用程序中使用它

我为此找到了以下正则表达式:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
现在我对dart还很陌生,但我知道我可以用r或r创建正则表达式字符串

现在使用dart,我可以用\来转义字符,所以如果我想转义以撇号开头和结尾的字符串中的撇号,我可以这样做:

final String a = 'foo\'bar';
但对于最后一个字符串a=r'foo'bar,我得到了一个错误。我怎样才能正确地逃脱呢

谢谢

不,r不是正则表达式,因此反斜杠被解释为文字反斜杠,而不是转义字符

对于通常包含大量反斜杠的字符串(例如正则表达式模式),不必转义每个反斜杠非常有用

正则表达式被创建为的实例

您可以连接使用不同分隔符的原始字符串,为整个模式创建单个字符串。在您的情况下,这应该有效:

String pattern = r"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|" + r'"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])';
RegExp exp = new RegExp(pattern);
不,r不是正则表达式,因此反斜杠被解释为文字反斜杠,而不是转义字符

对于通常包含大量反斜杠的字符串(例如正则表达式模式),不必转义每个反斜杠非常有用

正则表达式被创建为的实例

您可以连接使用不同分隔符的原始字符串,为整个模式创建单个字符串。在您的情况下,这应该有效:

String pattern = r"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|" + r'"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])';
RegExp exp = new RegExp(pattern);

所以我可以用另一个原始字符串来表示一个原始字符串,对吗?有更好的方法吗?是的,您可以使用不同的分隔符来表示两个或多个原始字符串。因此,我可以将一个原始字符串表示为“与另一个原始字符串表示为解决方案”,对吗?有更好的方法吗?是的,您可以使用不同的分隔符连接两个或多个原始字符串。您可以使用RegExp“…”创建一个正则表达式,如下所述,以确定Dart是否应该执行字符串插值。使用RegExp“…”r创建一个正则表达式,如下所述,该正则表达式表示Dart是否应该进行字符串插值。