不确定这是否是正确的方法,如果您有更好的选择,请进来:
我需要匹配一系列数据代码。这些代码本身正在被抓取并与其他文本分开,但是它们的位置和与该文本的标记仅保持约70%的一致性。我认为使用正则表达式可能不仅是获取异常值,而且还获取所有异常值的更好方法,因为代码非常标准,但是我不确定如何仅使用“某些”字母/括号/星号/ etc等来定位字符串。这是我的测试示例:
3-301.11(C)*
3-501.16 (Cold)
5-202.11(A)
3-501.16 (Hot)
6-501.111(C)*
7-201.11(A)*
大多数代码返回正常,如下:
5-103.11
我可以使用表达式^[0-9]+[-]+[0-9]+[0-9]+[.]+[0-9]+[0-9]
来定位其中的大多数,但结尾使我无法自拔
我在这里设置了示例:
编辑
只是尝试了Frank的解决方案,在其中添加了(。*),虽然有效,但是却开了一个新问题。由于这些代码是嵌入在文本中的,因此我的测试样本应在代码之后包含其他文本。我已经更新了链接/测试示例。
解决方案 感谢大家的帮助。我使用(现在)有效的解决方案更新了链接。
^\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?
答案 0 :(得分:1)
根据显示的代码,您可以大大简化此模式:
sudo chown -R "$USER":admin /usr/local
sudo chown -R "$USER":admin ~/Library/Caches/Homebrew
说明:
请注意,您无需像以前一样在portable-ruby2.3.7.leopard_64.bottle.tar.gz
中放入单个字符;实际上,/\d+-\d+\.\d+/
将被误解,因为[]
中的[-]
被解释为范围运算符,例如-
。
答案 1 :(得分:1)
您可以使用
'~^\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?~m'
或者,要匹配行中的任意位置:
'~\b\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?~'
请参见regex demo
详细信息
^
-一行的开头(如果需要在一行的任何位置匹配,请替换为\b
字边界)\d+
-1个以上数字-
-连字符\d+\.\d+
-1个以上数字,.
和1个以上数字(?:\s*\([^()]*\)\*?)?
-可选的模式匹配序列
\s*
-超过0个空格\(
-一个(
[^()]*
-除(
和)
以外的0多个字符\)
-一个)
\*?
-可选的星号。PHP代码示例:
if (preg_match_all('~\b\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?~', $s, $matches)) {
print_r($matches[0]);
}