我有一个问题是按'
字符拆分文字,除非'
前面有?
。
我用这个表达式来分割我的文字:
preg_split("/([^?]')/",$this->msg)
此表达式可以正常工作,但会删除分割字符串中的最后一个字符。
例如,本文:
ONEDAY'TWODAY?'AA'THREEDAY'
返回:
ONEDA
TWODA?0A
THREEDA
答案 0 :(得分:2)
它以这种方式工作,因为preg_split()
使用它匹配的表达式作为分隔符。
您的表达式与撇号('
)匹配,后跟任何字符,但?
(总共两个字符。)
您需要的是lookbehind assertion。
满足您需求的regex
是:
preg_split("/(?<!\?)'/", $this->msg);
(?<!
和)
中包含的部分是负面的 lookbehind 断言。它包含转义的问号字符(?
),因为它在regex
中具有特殊含义,我们需要将其解释为文字问号。否定断言与它所包含的表达式匹配。
断言与正常字符串进行比较,但不包含在匹配中;这只是背景。
执行相同操作的另一个regex
是:
preg_split("/(?<=[^?])'/", $this->msg);
它使用一个正的 lookbehind 断言(括在(?<=
和)
中),匹配除问号([^?]
)之外的任何字符。
答案 1 :(得分:0)
$string = "ONEDAY'TWODAY?'AA'THREEDAY'";
$parts = preg_split('/\'/sim', $string , -1, PREG_SPLIT_NO_EMPTY);
print_r($parts);
输出:
Array
(
[0] => ONEDAY
[1] => TWODAY?
[2] => AA
[3] => THREEDAY
)
演示: