Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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 正则表达式匹配非空白或前缀为'\\';_Regex - Fatal编程技术网

Regex 正则表达式匹配非空白或前缀为'\\';

Regex 正则表达式匹配非空白或前缀为'\\';,regex,Regex,我有一个以空格分隔的文件名列表,其中文件名中的空格前缀为“\” e、 g.“第一个\文件第二个\文件” 如何使正则表达式与每个文件名匹配 (\\ |[^ ])+ 除了空间之外的一切,除了他们逃跑的时候。应该可以,很抱歉最初误解了您的问题。我会这样做: (\S|(?<=\\) )+ /[^ \\]*(?:\\ [^\\ ]*)*/ 这是弗里德尔的“展开循环”成语。相对于其他字符,目标字符串中可能只有很少的转义空格,因此每次有机会时,您都会尽可能多地吸收其他字符。这比一次匹配一个字符的交

我有一个以空格分隔的文件名列表,其中文件名中的空格前缀为“\”

e、 g.“第一个\文件第二个\文件”

如何使正则表达式与每个文件名匹配

(\\ |[^ ])+

除了空间之外的一切,除了他们逃跑的时候。应该可以,很抱歉最初误解了您的问题。

我会这样做:

(\S|(?<=\\) )+
/[^ \\]*(?:\\ [^\\ ]*)*/
这是弗里德尔的“展开循环”成语。相对于其他字符,目标字符串中可能只有很少的转义空格,因此每次有机会时,您都会尽可能多地吸收其他字符。这比一次匹配一个字符的交替更有效

编辑:(Tomalak)我在正则表达式周围加了斜线,因为语法高亮器似乎能识别它们,并用一种颜色绘制整个正则表达式。如果没有它们,它可能会拾取其他字符,如引号,并错误地(令人困惑地)将正则表达式的各个部分涂成不同的颜色

(布拉德)OP只提到空格,所以我只允许引用空格,但你是对的。书中最初的展开循环示例是针对双引号字符串的,它可能包含多个转义序列中的任意一个,其中一个是转义引号。这是正则表达式:

/"[^\\"]*(?:\\.[^\\"]*)*"/

(Tomalak)我不知道你说它与“字符串开头的文件名”不匹配是什么意思。它似乎与OP示例中的两个文件名都匹配。但是,它也匹配一个空字符串,这是不好的。这是可以解决的,但除非证明效率是个问题,否则就不值得付出努力。Stefan的解决方案运行良好。

对于更简单且兼容的解决方案,这将匹配一个空行和一个[TAB]b.+1。并非所有的正则表达式风格都会隐藏。如果您使用此正则表达式和.Net,请确保不要打开IgnorePatternWhiteSpace。
(\\[].[^])+
可能会绕过IgnorePatternWhiteSpace我最初选择您的答案是因为有关Stefan匹配的aTABb的注释,但您的答案也是如此。这两个答案都很好,也解决了我的问题,但公平地说,斯塔凡的答案比较早,我更改了模式,使其不再匹配制表符或其他空白。实际上,在Java中,我将使用所有格量词和/或原子组来使用更直接的正则表达式。但是展开的循环可以使用任何语言。这与字符串开头的文件名不匹配。
(?:\\[^]*?)*
可能更好,如果例如“ab\cd”是有效匹配的话。
/"[^\\"]*(?:\\.[^\\"]*)*"/