Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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,我正在尝试使用此正则表达式: ^(\s+)<ProjectReference(.|\s)+?(Project2)</Name>(.|\s)+?</ProjectReference> ^(\s+)我认为最好的方法是使用xpath表达式或xml解析器 但是,如您在评论中所述,如果您希望使用regex捕获特定部分,则可以使用以下方法: (<ProjectReference.*?Project2[\s\S]*?</ProjectReference>)

我正在尝试使用此正则表达式:

^(\s+)<ProjectReference(.|\s)+?(Project2)</Name>(.|\s)+?</ProjectReference>

^(\s+)我认为最好的方法是使用xpath表达式或xml解析器

但是,如您在评论中所述,如果您希望使用regex捕获特定部分,则可以使用以下方法:

(<ProjectReference.*?Project2[\s\S]*?</ProjectReference>)
如果选中,您可以看到:

2nd Capturing group (.|\s)+?
  Quantifier: +? Between one and unlimited times, as few times as possible, expanding as needed [lazy]
  Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
  1st Alternative: .
    . matches any character (except newline)
  2nd Alternative: \s
    \s match any white space character [\r\n\t\f ]
首先,不要使用
(.|\s)
匹配所有内容,包括换行符;这是一个等待发生的冻结(有关更多信息,请参阅)。Notepad++中的搜索对话框包含一个用于此目的的复选框,标记为
。匹配换行符

第二,无论发生什么,你都不应该得到这样的结果。我在记事本++的本地副本中复制了它,它看起来像一个bug。也许正则表达式正在冻结,而NPP未能捕捉到错误。无论如何,您应该只得到一个匹配项,这就是我选择
时发生的情况。匹配换行符
,并将正则表达式更改为:

^\h*<ProjectReference.*?Project2</Name>.*?</ProjectReference>

其思想是允许点与任何匹配字符(包括换行符)匹配,除非它是序列
This
(.|\r\n)+
的第一个字符。贪婪的
将捕获所有内容。@Boristespider哎呀,在撰写我的问题时出现了编辑错误。我用
更正了它,但它仍然在做同样的事情。我直接从记事本++查找窗口复制并粘贴了该正则表达式。似乎您想要提取与
project2
相关的部分。为什么不使用xpath表达式或xml解析器?@FedericoPiazza我想我可以。我试图用DLL引用替换项目引用,而regex只是我想到的第一个方法。我选择它是因为我对正则表达式很熟悉,不需要学习任何新东西。@oscilatingcretin,好的。因此,为了确保您只想要上面放置的与
Project2\Project2.csproj
相关的特定部分,您使用
Include
元素中的
Project2
作为哨兵,而OP使用
元素中的一个。这使任务更简单,但你能确定它是有效的吗?@Alanmore,一双好眼睛,没有看到这一点。我基于OP目标来获取它。让我们看看OP是怎么说的,也许使用Include元素作为哨兵很好。@Alanmore您的解决方案在Notepad++和my.NET应用程序中都可以使用。我非常喜欢
[\s\s]
的把戏。在将来,我可能不会尝试所有的正则表达式魔法,而只是采取一种更为文字化的方法,我将在问题的末尾发布。@oscilatingcretin很乐意提供帮助。
[\s\s]
在不使用
s
标志的情况下匹配所有内容是一个众所周知的技巧。它通常用于像您这样的情况,即
与新行不匹配,但
[\s\s]
与新行匹配。我在Notepad++中尝试了第二个正则表达式,它可以工作,但我必须使用
。匹配已启用的换行符。这个问题最初是在我的.NET应用程序中发现的,所以我需要一个在那里工作的解决方案。.NET本机正则表达式选项仅支持
RegexOptions.Multiline
,这与Notepad++的选项不同。不过,我对你的答案投了赞成票。我已经找到了一个解决方案,它采用了一种更加文字化的方法,而不是试图做所有这些正则表达式巫术来匹配魔法模式。对不起,我想记事本++是你的目标口味。在.NET中,必须使用
多行
模式使
^
在行首匹配(NPP始终处于多行模式),并使用
单线
使
匹配新行。另外,.NET中不支持
\h
(水平空白),因此请使用
[\t*]
,或者返回使用
\s*
。或者干脆放弃;除非你想把引线空格归一化,否则这个部分是不必要的。在.NET中的单线模式的问题是,根据我的测试,它把整个STATE当作一个单行串来处理,所以你不能使用<代码> ^ < /COD>锚定到字符串中间的行。我想你一定是误解了你的测试结果。单线只影响点,多线只影响定位(
^
$
)。两者之间没有重叠,而且(不管它们的名字意味着什么)它们并不相互排斥。
(<ProjectReference.*?Project2[\s\S]*?</ProjectReference>)
MATCH 1
1.  [209-384]   `<ProjectReference Include="..\..\Project2\Project2.csproj">
      <Project>{6c2a7631-8b47-4ae9-a68f-f728666105b9}</Project>
      <Name>Project2</Name>
    </ProjectReference>`
^(\s+)<ProjectReference(.|\s)+?(Project2)</Name>(.|\s)+?</ProjectReference>
                          ^--- HERE
2nd Capturing group (.|\s)+?
  Quantifier: +? Between one and unlimited times, as few times as possible, expanding as needed [lazy]
  Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
  1st Alternative: .
    . matches any character (except newline)
  2nd Alternative: \s
    \s match any white space character [\r\n\t\f ]
^\h*<ProjectReference.*?Project2</Name>.*?</ProjectReference>
^\h*<ProjectReference(?:(?!</?ProjectReference).)*Project2</Name>.*?</ProjectReference>