在perl应用程序到dart的移植中,我必须处理下面形式的正则表达式。perl版本和Dart版本的执行结果都包括在内。想法很简单,替换字符串末尾的基本模式。对我来说,我从perl片段得到的结果是正确的。2但是从Dart版本得到的结果似乎不正确。我将感激你的帮助,以了解我哪里出错了。提前感谢。
my $str ="this is a line of text ‖ ###";
print("\nIn 1 str=|$str|");
$str =~ s/###$/\n/g;
print("\nIn 2 str=|$str|");
$str =~ s/ ‖ $//g;
print("\nIn 3 str=|$str|");
输出:
In 1 str=|this is a line of text ‖ ###|
In 2 str=|this is a line of text ‖
|
In 3 str=|this is a line of text
|
镖码:
void main() {
var str;
str ="this is a line of text ‖ ###";
print("\nIn 1 str=|$str|");
str = str.replaceAll(RegExp(r'###$'), "\n");
print("\nIn 2 str=|$str|");
str = str.replaceAll(RegExp(r' ‖ $'), "");
print("\nIn 3 str=|$str|");
print("\n\n");
}
输出:
In 1 str=|this is a line of text ‖ ###|
In 2 str=|this is a line of text ‖
|
In 3 str=|this is a line of text ‖
|
如您所见:
str = str.replaceAll(RegExp(r' ‖ $'), "");
不会将模式' ‖ $'替换为“”,这与它的perl等效项相反。
2条答案
按热度按时间rryofs0p1#
$
在两种regex中并不相等。Dart使用与JavaScript相同的正则表达式语言,Reference - What does this regex mean?表示如下:
$
匹配字符串末尾的LF,并且它匹配字符串的最后。$
匹配字符串的最后。下表中的行标识对等项:
| | Perl语言m=| Perl语言m=0时|Perl语言m=1时|JS系统m=| JS系统m=0时|JS系统m=1时|
| - -|- -|- -|- -|- -|- -|- -|
| 字符串的最末尾|
\z
| | |(?![\s\S])
|$
||| 文字结束|
\Z
|$
| |(?=\n?(?![\s\S]))
|(?=\n?$)
||| 行尾|
(?=\n)|\z
| |$
个|(?=\n)|(?![\s\S])
|(?=\n)|$
|$
|(多行模式改变了
$
的含义。“m=*"、“m=0”和“m=1”分别表示“是否处于多行模式”、“处于多行模式之外”和“处于多行模式”。)因此,要获得Perl在Dart中的行为,可以使用
(?=\n?$)
(一般情况下)或\s*$
(本例中)代替$
JavaScript很棒,但它在这里真的把球掉了。
8iwquhpp2#
在perl方言正则表达式中,
$
匹配字符串的结尾或换行符之前(如果换行符是字符串的最后一个字符(多行模式的规则有点不同,但您没有使用它,所以我们假装它不存在。\Z
总是具有相同的行为,即使在多行匹配中,因此为了保持一致性,有些人更喜欢使用它而不是$
。因此,RE
/g$/
将匹配如下也就是说,在最后一个换行符之前的g结尾。还有
\z
,它总是匹配字符串的实际结尾。由于换行符的存在,/g\z/
在上面的例子中不会匹配。Dart方言正则表达式的
$
的行为与\z
类似--因此,由于前面添加的换行符,第二个替换不匹配。它将按照预期进行匹配,并将所有文本替换为尾部换行符以匹配perl版本。或者去掉尾部内容,* 然后 * 追加一个换行符,而不是相反。