如何使用 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
- 一个数字。
我有一个正则表达式用于尝试检测屏幕分辨率,如下所示
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
- 一个数字。