Dart和perl使用h正则表达式不会产生相同的结果,

szqfcxe2  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(156)

在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等效项相反。

rryofs0p

rryofs0p1#

$在两种regex中并不相等。
Dart使用与JavaScript相同的正则表达式语言,Reference - What does this regex mean?表示如下:

  • 在Perl正则表达式中,$匹配字符串末尾的LF,并且它匹配字符串的最后。
  • 在JavaScript和Dart中,$匹配字符串的最后。

下表中的行标识对等项:
| | 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很棒,但它在这里真的把球掉了。

8iwquhpp

8iwquhpp2#

在perl方言正则表达式中,$匹配字符串的结尾或换行符之前(如果换行符是字符串的最后一个字符(多行模式的规则有点不同,但您没有使用它,所以我们假装它不存在。\Z总是具有相同的行为,即使在多行匹配中,因此为了保持一致性,有些人更喜欢使用它而不是$
因此,RE /g$/将匹配如下

some great string\n
                ^

也就是说,在最后一个换行符之前的g结尾。还有\z,它总是匹配字符串的实际结尾。由于换行符的存在,/g\z/在上面的例子中不会匹配。
Dart方言正则表达式的$的行为与\z类似--因此,由于前面添加的换行符,第二个替换不匹配。

str = str.replaceAll(RegExp(r' ‖\s+$'), "\n");

它将按照预期进行匹配,并将所有文本替换为尾部换行符以匹配perl版本。或者去掉尾部内容,* 然后 * 追加一个换行符,而不是相反。

相关问题