Regex返回不需要的值[已关闭]

z4iuyo4d  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(77)

**已关闭。**此问题需要debugging details。目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答问题。
10天前关闭。
社区在8天前审查了是否重新打开此问题,并将其关闭:

需要细节或清晰度通过editing this post添加细节并澄清问题。

Improve this question
我试图创建一个脚本,将梳理通过思科“显示运行所有”文件,并返回一个接口的基础上,如果一个命令出现。我有一个Regex的开始,但它的匹配上一个接口,而不是所需的接口。
我的正则表达式是interface (\S+)(?s).*?access-session port-control force-authorized
下面的示例信息。期望的结果应该是GigabitEthernet1/0/45,但它返回的是GigabitEthernet1/0/44
样本数据:

interface GigabitEthernet1/0/44  
access-session port-control auto 
!
interface GigabitEthernet1/0/45  
access-session port-control force-authorized

字符串

wi3ka0sx

wi3ka0sx1#

好吧,我想我已经很接近了,但这里是工作的地方。基本上我不得不告诉它停止匹配!它在配置文件中分隔接口配置。(添加[^!])

interface (\S+)(?s)[^!].*?access-session port-control force-authorized

字符串

lyfkaqu1

lyfkaqu12#

试试下面的匹配模式。

(?<=interface ).+?(?=\s+access-session port-control force-authorized)

字符串
或者,* 捕获模式 *。

interface (.+?)\s+access-session port-control force-authorized

1tu0hz3e

1tu0hz3e3#

下面的正则表达式就可以了(将(?s).*?替换为\s+):

interface (\S+)\s+access-session port-control force-authorized

字符串

  • 有关解释和尝试使用此正则表达式的选项,请参见this regex101.com page
  • 你不需要inline option(?s)(这使得.也匹配换行符),因为\s也匹配一个换行符,而且你只需要匹配 * 空白 *。
  • 通过.*?不匹配 any 字符串,就不需要像your own solution attempt那样 exclude 字符。
  • 下面是一个fixed version of your own attempt-但请注意,没有必要如此复杂(除非您的示例数据不能真正代表真实的数据):
interface (\S+)[^!]+?access-session port-control force-authorized

  • [^!]+? non-greetings匹配任何非空的字符串(包括换行符)* 不 * 包含!,从而防止匹配输入中的!字符。

至于你尝试了

  • interface (\S+)从 * 第一个 * interface块开始匹配,然后.*?成功匹配后续 * interface块中的任何文本 *,直到找到access-session port-control force-authorized文本。也就是说,您因此捕获了 * 第一个 * 接口块的名称,而不是与感兴趣的文本相关联的名称。
  • 请参阅this regex101.com page的演示。
  • 换句话说:使用.*.*?的 * 非贪婪 * 形式,并不能 * 保护您在匹配(最接近的,由于非贪婪)后续子表达式(access-session port-control force-authorized)之前 * 再次 * 匹配前面的子表达式(interface (\S+))(假设匹配了 * 任何 * 字符串)。

一个完整的PowerShell示例(注意,输入必须 * 作为一个单一的多行字符串 * 提供,因为你想匹配 * 跨行 *):

$str = @'
interface GigabitEthernet1/0/44  
access-session port-control auto 
!
interface GigabitEthernet1/0/45  
access-session port-control force-authorized
'@ 

if ($str -match 'interface (\S+)\s+access-session port-control force-authorized') {
  # Output what the 1st capture group matched.
  $Matches.1
}


上述输出'GigabitEthernet1/0/45',如所需。

相关问题