如何匹配两个值,而不依赖于它们在字符串中的相应位置

Pit*_*Pit 3 regex perl

我正在寻找同时匹配两个值的最佳方法.

我想获得一个真正的价值,如果这两个值是一个字符串,但我不知道他们会以什么顺序字符串中(例如,abcdefbedfa在情况下,我想匹配ab)

是否有更好的解决方案(特别是如果以后我需要更复杂的值来匹配),而不是:

$string =~ m/(a.*b)|(b.*a)/i
Run Code Online (Sandbox Code Playgroud)

Eug*_*ash 11

$string =~ /a/i && $string =~ /b/i;
Run Code Online (Sandbox Code Playgroud)

  • @Pit,当优雅与清晰不一致时,选择清晰.交替方法和前瞻方法可能看起来更优雅但是如果我试图维护你的代码,那么即使我能够立即理解代码的意图,也需要花费几秒钟才能理解代码的意图.这两种表达方式在正在做的事情上更加紧张,找到两种模式独立于另一种. (3认同)

cod*_*ict 5

您可以使用正向前瞻:

$string =~ /^(?=.*a)(?=.*b).*$/i
Run Code Online (Sandbox Code Playgroud)

一般来说,如果你想检查字符串中是否存在foobar你可以做的:

$string =~ /^(?=.*foo)(?=.*bar).*$/i
Run Code Online (Sandbox Code Playgroud)

如果你想要foobar作为单独的单词而不是任何其他单词的子串,你可以将单词边界添加为:

$string =~ /^(?=.*\bfoo\b)(?=.*\bbar\b).*$/i
Run Code Online (Sandbox Code Playgroud)

以后如果你想添加检查存在,baz你可以这样做:

$string =~ /^(?=.*\bfoo\b)(?=.*\bbar\b)(?=.*\bbaz\b).*$/i
Run Code Online (Sandbox Code Playgroud)