我知道这|
是逻辑“OR”运算符里面一个正则表达式。但是等效的“AND”运算符是什么(同样,里面正则表达式)?
笔记:
- 这与多个表达式的“AND”运算符无关,而只是
&&
。 - 例如,类似于
/A&B/
同时匹配A
和 的内容B
。
答案1
在我熟悉的任何正则表达式风格中都没有这样的运算符。如果您想匹配同时具有两者的输入A
,B
您可以编写A.*B
or B.*A
,两者都需要按特定顺序进行;或组合两个表达式以接受任一顺序A.*B|B.*A
。
或者,进行两场单独的比赛。例如,在awk
:
awk '/A/ && /B/' file
或手动处理两个grep
实例:
grep A file | grep B
您实际上并不需要在正则表达式中使用 AND 运算符。正则表达式的思想是它描述一个字符串。根据定义,您将要匹配的内容放入正则表达式中。因此需要一个 OR 来允许匹配 A 或 B,但是 AND 基本上内置于正则表达式中:您在正则表达式中编写的任何内容都需要匹配,因此所有内容基本上都由 AND 运算符连接,这使得专用的 AND 毫无意义。
答案2
注意:正如 Stéphane Chazelas 的评论所暗示的,这个答案在某种程度上因存在正则表达式的实现做允许 AND 运算符。下面的推理仍然是正确的,因为只有当您确保所施加的条件相互兼容时,这样的运算符才有意义。
我认为答案是,|
RegExes 中不可能存在与 - 运算符等价的“AND”,因为最终,正则表达式在输入字符串的字符级别上执行匹配(尽管有时通过重复运算符隐式执行),从而直接捆绑到字符串中的特定位置(参见例如此问答用于类似的讨论)。
关键是,如果您有以下形式的表达式(awk
由于您的问题标题,我在此处使用显式语法)
$0 ~ /something(A|B)somethingelse/
这要求字符串具有或者A
或在紧接其后和之前的B
特定位置something
somethingelse
匹配。如果您有带有重复运算符的模式,则位置要求可能会更加动态,例如
$0 ~ /[a-f]+(A|B)[0-9]+/
A
但仍然重要的是, or的出现B
与位置特定相关仅包含小写字母的模式之后a
... f
(1)以及仅包含数字的模式之前0
...9
。
不能有对应的“AND”条件
$0 ~ /something(A&B)somethingelse/
因为这意味着输入字符串必须在同一位置包含A
和B
,这显然是行不通的。
因此,“AND”运算符有用的唯一用例是描述字符串的一般属性,其中每个所需的属性都可以由单个正则表达式表示,例如“字符串必须包含至少一个A
并且至少一个,B
无论它们的确切绝对和相对位置”,但这将再次让我们处于&&
组合多个表达式的操作符上,您说您对此不感兴趣,当然还有此解决方法的各种替代公式@terdon的回答。
(1)至少按 C 整理顺序