与“|”等效的“AND”运算符是什么在正则表达式中使用“awk”时?

与“|”等效的“AND”运算符是什么在正则表达式中使用“awk”时?

我知道这|是逻辑“OR”运算符里面一个正则表达式。但是等效的“AND”运算符是什么(同样,里面正则表达式)?

笔记:

  • 这与多个表达式的“AND”运算符无关,而只是&&
  • 例如,类似于/A&B/同时匹配A和 的内容B

答案1

在我熟悉的任何正则表达式风格中都没有这样的运算符。如果您想匹配同时具有两者的输入AB您可以编写A.*Bor 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特定位置somethingsomethingelse匹配。如果您有带有重复运算符的模式,则位置要求可能会更加动态,例如

$0 ~ /[a-f]+(A|B)[0-9]+/

A但仍然重要的是, or的出现B与位置特定相关仅包含小写字母的模式之后a... f(1)以及仅包含数字的模式之前0...9

不能有对应的“AND”条件

$0 ~ /something(A&B)somethingelse/

因为这意味着输入字符串必须在同一位置包含AB,这显然是行不通的。

因此,“AND”运算符有用的唯一用例是描述字符串的一般属性,其中每个所需的属性都可以由单个正则表达式表示,例如“字符串必须包含至少一个A并且至少一个,B无论它们的确切绝对和相对位置”,但这将再次让我们处于&&组合多个表达式的操作符上,您说您对此不感兴趣,当然还有此解决方法的各种替代公式@terdon的回答


(1)至少按 C 整理顺序

相关内容