如何使用 lookahead 排除正则表达式中的特殊字符

How to use lookahead to exclude special characters in a regular expression

我有一个正则表达式用于尝试检测屏幕分辨率,如下所示

xrandr | grep -P '(.*\d+x\d+)* | awk {'print'}

当我在我的脚本中使用它时,它会给我这样的东西

输出

1920x1200+0+0
1920x1200+1920+0
primary
1920x1200+1920+1200

我试过使用 lookahead,但我没有正确使用它,我猜是因为我得到了相同的匹配项。

代码

xrandr | grep -P '(.*\d+x\d+)*^(?![\+]+\d\+\d) | awk {'print'}

谁能解释一下前瞻如何处理特殊字符,以便我解决这个问题?我只想 return 下面表格中的屏幕分辨率或一些变化。我想做的是区分双显示器和 4 显示器显示器。

xrandr | grep -P '(.*\d+x\d+)*^(?![\+]+\d\+\d) | awk {'print'} | tr -d '\n'

预期

1920x12001920x1200primary1920x1200

或这个

1920x1200
1920x1200
primary
1920x1200

加分,如果可以 return 只是屏幕分辨率。

1920x1200
1920x1200
1920x1200
1920x1200

xrandr 输出

Mon0 connected 1920x1200+0+0 0mm x 0 mm
   1920x1200_c 59.95*
Mon0 connected 1920x1200+0+0 0mm x 0 mm
   1920x1200_c 59.95*
Mon0 connected primary 1920x1200+0+1200 0mm x 0 mm
   1920x1200_c 59.95*
Mon0 connected 1029x1200+1920+1200 0mm x 0 mm
   1920x1200_c 59.95*

您可以跳过 grep 并在一个 awk 中完成此操作:

xrandr | awk 'NF >= 3 && /[0-9]+x[0-9]+/ {sub(/[+-].*/, "", ); print }'

1920x1200
1920x1200
primary
1029x1200

备选单gnu grep方案:

xrandr | grep -oP 'connected\h+\K(\d+x\d+|\S+)'

(.*\d+x\d+)*^(?![\+]+\d\+\d) 模式匹配并捕获到组 1 中的可选序列,其中包含除换行符以外的任何零个或多个字符,尽可能多,然后是 1+ 位数字,x, 1 + 数字,然后需要字符串位置的开始(这使得模式一直失败!)并确保没有一个或多个 + 个字符,一个数字, 一个 + 和一个紧挨着当前位置右侧的数字。 这看起来像是一个非常损坏的模式,从不匹配任何字符串。

你的逻辑可以实现为

xandr | grep -oP '\b\d+x\d+(?!(?:\+\d+\+)?\d)'

参见online demo and the regex demo

详情:

  • -oP - 仅输出匹配并启用 PCRE 正则表达式引擎
  • \b\d+x\d+(?!(?:\+\d+\+)?\d):
    • \b - 单词边界
    • \d+ - 一位或多位数字
    • x - 一个 x
    • \d+ - 一位或多位数字
    • (?!(?:\+\d+\+)?\d) - 如果在当前位置的右侧有
    • ,则匹配失败的否定前瞻
    • (?:\+\d+\+)? - +、一个或多个数字和 +
    • 的可选序列
    • \d - 一个数字。