Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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/4/regex/19.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
.net 如何优化此正则表达式以获得更好的性能?_.net_Regex_Negative Lookbehind - Fatal编程技术网

.net 如何优化此正则表达式以获得更好的性能?

.net 如何优化此正则表达式以获得更好的性能?,.net,regex,negative-lookbehind,.net,Regex,Negative Lookbehind,我正在尝试优化我的.NET应用程序的正则表达式之一 正则表达式:( 逻辑: 查找匹配的WordC 连接WordB以匹配(如果在WordC之前出现) 如果WordC(即使前面有WordB)前面有WordA,则不匹配任何内容 应匹配: WordC 单词 不应匹配: 单词 单词a单词b单词c 表达式可以工作,但正如您所看到的,单词B在表达式中出现了两次,因此我尝试删除其中一个以获得更好的性能 注:“单词”实际上是复杂的表达 有没有办法?优化(?regex)(即(?和(?)的组合)的问题就是

我正在尝试优化我的.NET应用程序的正则表达式之一

正则表达式:

逻辑:

  • 查找匹配的WordC
  • 连接WordB以匹配(如果在WordC之前出现)
  • 如果WordC(即使前面有WordB)前面有WordA,则不匹配任何内容
应匹配:

  • WordC
  • 单词
不应匹配:

  • 单词
  • 单词a单词b单词c
表达式可以工作,但正如您所看到的,单词B在表达式中出现了两次,因此我尝试删除其中一个以获得更好的性能

注:“单词”实际上是复杂的表达

有没有办法?

优化
(?regex)(即
(?和
(?)的组合)的问题就是说
WordB
WordC
之间用空格分隔,并且反向查找不会使正则表达式引擎跳过匹配的短语,只要前面有
WordA
,它只会跳过失败的位置,因此如果您只使用
WordC
,它就会匹配(?.Lookback必须同时限制
WordB\sWordC
WordC
,这就是为什么必须在Lookback模式中重复可选的
WordB
,就像在上面显示的两个“解构”模式中使用它一样

因此,对于纯字符串正则表达式,没有其他方法

涉及一些代码更改的变通方法可能看起来像

var rx=@“(WordA\s)?(?:WordB\s)?WordC”;
var strings=新列表{“WordC”、“WordB WordC”、“WordA WordC”、“WordA WordB WordC”};
foreach(字符串中的变量s)
{
var m=正则表达式匹配(s,rx);
WriteLine(“{0}:{1}”,s,(m.Groups[1]。成功?“不匹配”:m.Value));
}
//=>WordC:WordC
//=>WordB-WordC:WordB-WordC
//=>WordA WordC:不匹配
//=>WordA WordB WordC:不匹配


(WordA\s)?(?:WordB\s)?WordC
正则表达式中,
(WordA\s)?
captures
WordA
带空格被捕获到组1中,如果匹配,我们知道我们需要放弃匹配。如果组1
.Success
值为false,则表示匹配有效。

性能有什么问题,您是如何衡量的?看起来您并没有试图获得更好的性能,您只是想t来缩短正则表达式。@PavelAnikhouski我通常使用Regex101步数,但由于它的风格不支持lookback中的量词,所以我不能用这种方式进行度量。表达式中的每个“WordX”都可以是一个长/复杂的表达式(即:500+个字符),我将其与许多字符串(可能太长)匹配所以我认为,整个表达式越长,处理它所需的步骤就越多;因此,如果可以通过删除重复的部分来缩短它,效果会更好。这只是一种感觉(“不要复制代码”,他们说lol),但我可能错了…:-)我用秒表来测量它。@WiktorStribiżew好吧,它足够短了,只是感觉设计不好……长度不重要,但步数很重要。步数不是正则表达式效率的直接证据。是的,使用秒表可能是更好的选择。不过,你有权访问代码吗?或者你想把所有东西都塞进正则表达式中吗正则表达式模式?