mas*_*asi 4 html regex powershell powershell-3.0
我在Powershell中使用Rexex时遇到了一些麻烦.似乎有一个遗留错误或其他什么.
我想使用的文本是一个html文件,看起来像这样(Example1):
<span>[Mobile: %mobile% |] Phone: %telephone% [| Fax: %faxNumber%]</span>
<Span>
Run Code Online (Sandbox Code Playgroud)
问题是,由html编辑引起的,我也可能得到这样的东西(例2):
<span>[Mobile:
%mobile% |] Phone: %telephone% [| Fax: %faxNumber%]</span>
Run Code Online (Sandbox Code Playgroud)
如你所见,我们得到了换行符和html转义,修复了空格 .
我的Powershell Regex看起来像这样:
$x = $x -ireplace '(?ms)\[(.?){7}Fax(.*?)\]', 'MyReplacement1'
Run Code Online (Sandbox Code Playgroud)
还有这个
$x = $x -ireplace '(?ms)\[(.?){7}Mobile(.*?)\]', 'MyReplacement2'
Run Code Online (Sandbox Code Playgroud)
基本上[标记变量的开头和]结束.由此产生两个问题:
(.?){7}用来允许一些(这里是exacly 7)字符,并避免匹配传真附近的第一个[近移动和最后]之间的孔部分(如果我将使用它会发生(.*?)而不是(.?){7}).我不确定是否有替代方案,以便我可以在起始[和变量关键字"传真"之间允许任何数字(而不是7)字符.这样可以避免 在添加类似东西时出现错误匹配(其中只有7个字符不够,就像我说的那样(.*?)会失败).希望我能够解释它(有点难) - 如果没有:请随意问!我很乐意为专业人士提供任何帮助甚至正则表达式的建议,以避免我现在没有考虑的任何进一步问题......
编辑:(例3):
<span>[Mobile:
%mobile% |] Phone: %telephone% [| Fax:
%faxNumber%]</span>
Run Code Online (Sandbox Code Playgroud)
DotAll模式的诀窍是使用[\s\S]而不是..此字符类匹配任何字符(因为它匹配空格和非空格字符).(一样[\w\W]或者[\d\D],但空间似乎是种约定的.)
为了解决这个问题,7你可以简单地禁止]在你想要匹配的那个之前关闭(顺便说一下,这也使得DotAll不再需要).所以像这样的东西应该适合你:
\[([^\]:]*)Fax([^\]]*)\]
Run Code Online (Sandbox Code Playgroud)
它看起来有点难看,但它只是意味着:
\[ # literal [
( # capturing group 1
[^\]:]* # match as many non-:, non-] characters as possible
) # end of group 1
Fax # literal Fax
( # capturing group 2
[^\]]* # match as many non-] characters as possible
) # end of group 2
\] # literal ]
Run Code Online (Sandbox Code Playgroud)
请注意,这些模式都不需要多线模式m(既不是你的模式也不是我的模式),因为它所做的只是分别制作^和$匹配行的开头和结尾.但是没有一个模式包含这些元字符.所以修饰语不做任何事情.
我的控制台输出:
PS> $x = "<span>[Mobile: %mobile% |] Phone: %telephone% [| Fax: %faxNumber%]</span>"
PS> $x -ireplace '\[([^\]:]*)Mobile([^\]]*)\]', 'MyReplacement1'
<span>MyReplacement1 Phone: %telephone% [| Fax: %faxNumber%]</span>
PS> $x -ireplace '\[([^\]:]*)Fax([^\]]*)\]', 'MyReplacement2'
<span>[Mobile: %mobile% |] Phone: %telephone% MyReplacement2</span>
Run Code Online (Sandbox Code Playgroud)