0

我在下面创建了一个正则表达式(使用 php);terms它必须与给定字符串中的ALL 匹配,该字符串 a-z0-9包含、和。._-

我的表达是:'~(?:\(|\s{0,},\s{0,})([a-z0-9._-]+)(?:\s{0,},\s{0,}|\))$~i'

我的目标字符串是:('word', word.2, a_word, another-word). 预期terms的结果是:word.2, a_word, another-word.

我目前得到:another-word

我的目标

我从我的目标字符串中检测到一个 MySQL 函数,这工作正常。然后我想要该目标字符串中的所有字段。这是我自己的ORM。

我想可能存在这样一种情况,即在此表达式中包含进一步的括号。

4

2 回答 2

1

也许使用正则表达式是矫枉过正的。在这种文本中,您可以删除括号并用逗号分解字符串。

于 2012-07-11T08:41:09.470 回答
1

据我所知,您有一个逗号分隔的术语列表,并且希望只找到满足[a-z0-9._\-]+. 如果是这样,这应该是正确的(它至少为您的示例返回正确的结果):

'~(?<=[,(])\\s*([a-z0-9._-]+)\\s*(?=[,)])~i'

主要问题是:

  • $ 在末尾,它将查询锚定到字符串的末尾
  • 匹配所有内容时,您会从上一场比赛的结尾继续 - 这意味着如果您在一场比赛的结尾匹配逗号/右括号,则在下一场比赛的开头匹配时不存在。我已经通过后视 ( (?<=...) 和前瞻 ( (?=...)解决了这个问题
  • 您的反斜杠需要进行双重转义,因为 PHP 在解析字符串时可能会剥离第一个反斜杠。

编辑:由于您在评论中说某些术语可能是包含逗号的字符串,因此您首先要通过以下方式运行输入:

$input = preg_replace('~(\'([^\']+|(?<=\\\\)\')+\'|"([^"]+|(?<=\\\\)")+")~', '"STRING"', $input);

它应该用'“STRING”'替换所有字符串,这可以很好地匹配其他正则表达式。

于 2012-07-11T13:59:02.027 回答