Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式与EOF匹配_Regex - Fatal编程技术网

Regex 正则表达式与EOF匹配

Regex 正则表达式与EOF匹配,regex,Regex,我有一些像这样的数据 john, dave, chris rick, sam, bob joe, milt, paul 我用这个正则表达式来匹配名字 /(\w.+?)(\r\n|\n|,)/ 这在大多数情况下有效,但文件在最后一个单词后突然结束,这意味着最后一个值不是以EOF结尾的。有没有办法匹配正则表达式中的EOF,这样我就可以把它放在第二个分组中?这个问题的答案是\Z我花了一段时间才弄明白,但它现在起作用了。请注意,相反,\A匹配整个字符串的开头(与匹配一行开头的^和$相反)。假设您使用

我有一些像这样的数据

john, dave, chris
rick, sam, bob
joe, milt, paul
我用这个正则表达式来匹配名字

/(\w.+?)(\r\n|\n|,)/

这在大多数情况下有效,但文件在最后一个单词后突然结束,这意味着最后一个值不是以EOF结尾的。有没有办法匹配正则表达式中的EOF,这样我就可以把它放在第二个分组中?

这个问题的答案是
\Z
我花了一段时间才弄明白,但它现在起作用了。请注意,相反,
\A
匹配整个字符串的开头(与匹配一行开头的
^
$
相反)。

假设您使用适当的修饰符强制将字符串视为一个整体(而不是逐行-如果对您有效,则使用它),只需添加另一个选项-字符串结尾:(\r\n |\n |,|$)

/(\w.+?)(\r\n |\n |,|$)/
EOF实际上不是一个字符。如果您有一个多行字符串,那么“$”将与字符串的结尾以及行的结尾相匹配

在Perl及其同类语言中,
\A
\Z
匹配字符串的开头和结尾,完全忽略换行符


POSIX正则表达式的GNU扩展使用
\`
\'
实现相同的功能。

您真的需要捕获行分隔符吗?如果没有,则此正则表达式应是您所需的全部:

/\w+/
假设您要匹配的所有子字符串都完全由单词字符组成,如您的示例中所示。

是否可以尝试$(EOL/EOF)而不是(\r\n |\n)


将Ryan建议的\Z行为与\Z进行对比:

$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\Z/world/g; print(":$corpus:\n")' :helloworld world: $ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\z/world/g; print(":$corpus:\n")' :hello world: $ $perl-we'my$corpus=“hello\n”$语料库=~s/\Z/world/g;打印(“:$corpus:\n”)' :helloworld 世界: $perl-we'my$corpus=“hello\n”$语料库=~s/\z/world/g;打印(“:$corpus:\n”)' :你好 世界: $ 经济特区:

\Z仅在字符串末尾或末尾换行符之前匹配 \z仅在字符串末尾匹配 将测试用例转换为Ruby(1.8.7,1.9.2)的行为与此相同。
在上面的评论中,@mmdemirbas补充说Java是相同的。

在Visual Studio中,您可以找到类似这样的EOF:
$(?![\r\n])
。无论行尾是CR、CRLF还是LF,这都有效

作为奖励,您可以确保所有代码文件都有一个最终换行标记,如下所示:

               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js
查找什么:(?
工作原理:

找到前面没有CR或LF,后面也没有CR或LF的任何行尾(零宽度匹配)。一些想法会告诉你为什么这样做


请注意,您应该替换为所需的行尾字符,可以是CR、LF或CRLF。

最近我在寻找类似的字符,但不是JavaScript

把这个放在这里,这样任何有同样问题的人都能从中受益

var matchEndOfInput = /$(?![\r\n])/gm;

基本上,这将匹配行尾,行尾后面没有回车符或新行字符。本质上,这与
\Z
相同,但适用于JavaScript。

您是在尝试捕获一个组中的所有名称还是每个名称一个捕获组?使用regex遇到问题时,要做的一件事是尝试您的模式元素孤立地说。如果你担心最后的标记,请在没有标记的情况下测试你的表达式。只是想添加一个很棒的正则表达式测试站点:重复?@Sinan-我同意;合并可能。我不记得了:-)如果你在netbeans中对项目文件搜索而不是文件内搜索如此感兴趣,请提醒一下,以下内容的行为将有所不同<代码>(\s*)\?>(\s*)\Z
。。。在进一步挖掘之后,这里是对项目文件夹有效的方法:
(\s*)\?>(\s*)(\n*)(\W)\Z
FYI:这是用文件末尾的换行符替换所有结束的php标记。原来
\a
也可以在Visual Studio中使用“查找和替换”。像往常一样小心地使用这些东西,但它为我节省了大量的手工操作,我很高兴它确实能做正确的事情;如果我使用
\Z
作为分隔符,尾随的换行符将被修剪。当我将分隔符更改为
\z
时,尾随的换行符被保留。这似乎也适用于Java。VisualStudio2019中有一个bug,用它替换所有可能会导致在文件末尾添加两个换行符。我认为这与“保存时自动插入换行符”选项有关。
               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js
var matchEndOfInput = /$(?![\r\n])/gm;