REGEX来操作字符串中的变量赋值

时间:2012-12-26 15:04:44

标签: php regex preg-replace

我的PHP脚本需要一个正则表达式,它可以帮助我使用preg_replace操作一些字符串。

例如,假设我有以下字符串:

myvar = first_value AND var2 = second_value

我希望将其转换为:

myvar = 'first_value' AND var2 = 'second_value'

但是,我还想忽略当价值已经有一个单引号时。因此myvar = first_value AND var2 = 'second_value'将变为myvar = 'first_value' AND var2 = 'second_value'而不是myvar = 'first_value' AND var2 = ''second_value''

我还希望它能够处理子字符串中的空格,当这个值已经有一个单引号时。因此myvar = first_value AND var2 = 'second value'将变为myvar = 'first_value' AND var2 = 'second value'而不是myvar = 'first_value' AND var2 = 'second' value'

注意:字符串在任何时候都不包含带有空格的不带引号的字符串值的变量赋值,即myvar = first value是一个永远不会出现的场景。但是,字符串可以包含任何其他字符,甚至是特殊字符,例如myvar = &%$@_imspecial_*完全有效。

我正在使用的PHP代码如下所示(#DontLaugh):

$col_clause_str = "myvar = first_value AND var2 = second_value";
$replace_pattern_str = '/([\w\@\-]+)\s*(\=|\>|\>\=|\<|\<\=)\s*\'{0,1}([\w\@\.\:\+\-\/\|\{\}\[\]\~\%\$\*\!]+)\'{0,1}/i';
$replace_str = '\1 \2 \'\3\'';
$col_clause_str = preg_replace($replace_pattern_str, $replace_str, $col_clause_str);

如何改进此正则表达式?!

提前致谢。

修改 我将问题更新为更具描述性。

2 个答案:

答案 0 :(得分:3)

您可以替换此正则表达式: -

"/(?<==\s)(\w+)/i"

: -

'\1'

更新: -

好的,对于您更新的问题,您可以使用此正则表达式: -

"/(?<==\s)([^\s']+)/i"

并用相同的字符串替换它 - '\1'

答案 1 :(得分:0)

我不熟悉PHP及其正则表达式功能,但是这个Python代码可能对你有所帮助:

In [1]: import re

In [2]: str1 = "myvar = first_value AND var2 = second_value"

In [3]: str2 = "myvar = first_value AND var2 = 'second_value'"

In [4]: str3 = "myvar = 'first value' AND var2 = second_value"

In [5]: regex = r"""
 .....:     (?P<variable_name>
 .....:         \w+
 .....:         \s*
 .....:         =
 .....:         \s*
 .....:     )
 .....:     (?<! ' )     # negative look-behind assertion
 .....:     (?P<value>
 .....:         \w+
 .....:     )
 .....:     (?! ' )      # negative look-ahead assertion
 .....:     """

In [6]: replacement = "\g<variable_name>'\g<value>'"

In [7]: re.sub(regex, replacement, str1, flags=re.X)
Out[7]: "myvar = 'first_value' AND var2 = 'second_value'"

In [8]: re.sub(regex, replacement, str2, flags=re.X)
Out[8]: "myvar = 'first_value' AND var2 = 'second_value'"

In [9]: re.sub(regex, replacement, str3, flags=re.X)
Out[9]: "myvar = 'first value' AND var2 = 'second_value'"

您可能需要调整\w+以适应变量名称中可能出现的所有字符。这里的想法是使用负面的后视和前瞻断言来检查变量值是否已被引号括起来。