gpt4 book ai didi

regex - Linux bash shell 中带有多个点的正则表达式会给出奇怪的结果

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:38 24 4
gpt4 key购买 nike

我尝试匹配包含很多点的子字符串,但在 Debian Linux shell 中失败。我制作了一个简单的脚本来查看点的处理方式,发现它完全不符合规则。我重试了 Bash、perl、Ubunta shell,结果还是一样。脚本和输出如下。

#!/bin/sh   
my_regex=u2734523abcABCB.C123.ABC.abc.1..2.34.2
Numbering=123456789_123456789_123456789_123456789
echo "$my_regex"
echo "$Numbering"
echo `expr index "$my_regex" '(ABC)'`
echo `expr index "$my_regex" '(ABC\.)'`
echo `expr index "$my_regex" '(\.\.)'`
echo `expr index "$my_regex" '(.)'`
echo `expr index "$my_regex" '(\.1)'`

输出:

u2734523abcABCB.C123.ABC.abc.1..2.34.2   
123456789_123456789_123456789_123456789
12
12
16
16
16

第一个正则表达式应匹配 ABC 并返回第一个字符的数字位置。它有效。
第二个应该找到 ABC 后跟点,看起来它忽略了点。
第三个应该找到两个点,但它找到了第一次出现的一个点。再次忽略?
第四个应该首先找到任何字符,但它仍然在位置 16 上找到点。
第五个应该找到一个点后跟 1,它仍然找到第一个出现的点。
看起来既不像\也不像 [ ] (我也尝试过),而且点本身也不像常见的正则表达式那样工作。
为什么?

最佳答案

expr索引与正则表达式无关。

expr index STRING CHARS 输出 STRING 中第一次出现的任何 CHARS 的索引。因此,您第一次搜索 '(ABC)' 会找到字符串中的第一个左括号、A、B、C 或右括号。第一个是位置 12 处的 A。

'(ABC\.)' 执行相同的操作,只不过它现在还查找反斜杠或句点。但A仍然是第12位的第一场比赛。

'(\.\.)' 仅查找括号、反斜杠或句点。第一场比赛是第 16 位的时段。

同样,您的所有其他搜索都会在位置 16 处找到句点,因为您列出的其他字符都不会出现在该位置之前。

(顺便说一句,仅用反引号捕获输出并立即回显它是愚蠢的。通过省略echo和反引号,您会得到相同的结果。)

关于regex - Linux bash shell 中带有多个点的正则表达式会给出奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32545941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com