带 POSIX 括号表达式的正则表达式在 bash 中不起作用
Regular expression with POSIX bracket expressions not working in bash
我有这个适用于 Rubular 的正则表达式
value[[:space:]]*=[[[:digit:]]\.]+>([[[:alpha:]][[:space:]]*\/]+)
关于这段文字:
<option value =12.34.567>London</option>
<option value =89.12.345>New York / San Francisco</option>
它给出了结果:
Match 1
1. 12.34.567
2. London
Match 2
1. 89.12.345
2. New York / San Francisco
这就是我想要的。但是当我在 bash 脚本中使用正则表达式时:
#!/usr/bin/env bash
regex="value[[:space:]]*=([[[:digit:]]\.]+)>([[[:alpha:]][[:space:]]*\/]+)"
while read line
do
echo $line
if [[ $line =~ $regex ]]; then
echo ${BASH_REMATCH}
fi
done < test.html
它不起作用(test.html 有上面的 html 示例。)
根据测试,我认为它卡在了分组中
[[[:digit:]]\.]+
bash 处理正则表达式的方式是否与 ruby 不同?
我建议您将正则表达式更改为,
regex="value[[:space:]]*=([[:digit:].]+)>([[:alpha:][:space:]*/]+)"
[[:digit:].]
^ ^ ^^^
| | |||-> end of char class
start digit |-> DOT
OR
在pcre中,上面会写成[\d.]
我有这个适用于 Rubular 的正则表达式
value[[:space:]]*=[[[:digit:]]\.]+>([[[:alpha:]][[:space:]]*\/]+)
关于这段文字:
<option value =12.34.567>London</option>
<option value =89.12.345>New York / San Francisco</option>
它给出了结果:
Match 1
1. 12.34.567
2. London
Match 2
1. 89.12.345
2. New York / San Francisco
这就是我想要的。但是当我在 bash 脚本中使用正则表达式时:
#!/usr/bin/env bash
regex="value[[:space:]]*=([[[:digit:]]\.]+)>([[[:alpha:]][[:space:]]*\/]+)"
while read line
do
echo $line
if [[ $line =~ $regex ]]; then
echo ${BASH_REMATCH}
fi
done < test.html
它不起作用(test.html 有上面的 html 示例。)
根据测试,我认为它卡在了分组中
[[[:digit:]]\.]+
bash 处理正则表达式的方式是否与 ruby 不同?
我建议您将正则表达式更改为,
regex="value[[:space:]]*=([[:digit:].]+)>([[:alpha:][:space:]*/]+)"
[[:digit:].]
^ ^ ^^^
| | |||-> end of char class
start digit |-> DOT
OR
在pcre中,上面会写成[\d.]