【发布时间】:2013-01-18 18:18:01
【问题描述】:
给定一个字符串,匹配单词第一次出现之后出现的所有内容。该单词不得出现在一对括号内的任何位置,但其他单词可以。例如:
SELECT
t1.col1,
(SELECT t2.col1 FROM table2 t2
WHERE t2.id IN(SELECT * FROM table5 WHERE id = t2.id)
) AS alias1,
t1.col2
----------
FROM
table1 t1,
(SELECT id FROM table3 t3 WHERE t3.id = t1.table3_id) t3,
table4 t4
我正在寻找虚线之后的所有内容 - 特别是在单词 FROM 第一次出现之后的所有内容,它没有出现在一对括号内的任何地方
如果 Regex 不行,我会制作一个 PHP 语句来解析。我也很难过,寿!我想这样做,我必须按单词和括号对字符串进行标记?
【问题讨论】:
-
不能用正则表达式处理一般情况;那些无法计数,因此无法告诉您在打开括号后它在什么时候再次关闭。不过,我不知道 sql 是否支持对允许这样做的正则表达式的扩展。
-
我会考虑制作一个 PHP 函数,但也很难做到!
-
您可以这样做:从第一个字母开始扫描字符串以查找 FROM。为嵌套深度保留一个计数器,初始化为 0。每当括号打开时,增加它;当括号关闭时,将其减小(减 1)。每当计数器!= 0 时,只需扫描字符直到计数器为 0,而不检查 FROM。一旦你第一次出现 FROM,就从那里开始获取子字符串。
-
您的建议看起来不错 - 无法弄清楚如何做到这一点;-)