PHP Regex仅匹配一些字母/单词和标点符号

时间:2018-07-19 12:30:06

标签: php regex

不确定这是否是正确的方法,如果您有更好的选择,请进来:

我需要匹配一系列数据代码。这些代码本身正在被抓取并与其他文本分开,但是它们的位置和与该文本的标记仅保持约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]来定位其中的大多数,但结尾使我无法自拔

我在这里设置了示例:

https://regexr.com/3smmj

编辑

只是尝试了Frank的解决方案,在其中添加了(。*),虽然有效,但是却开了一个新问题。由于这些代码是嵌入在文本中的,因此我的测试样本应在代码之后包含其他文本。我已经更新了链接/测试示例。

解决方案 感谢大家的帮助。我使用(现在)有效的解决方案更新了链接。

^\d+-\d+\.\d+(?:\s*\([^()]*\)\*?)?

2 个答案:

答案 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]);
}