我有以下正则表达式模式:(?iu)[(?=\s)]\bgo\b(?!\S)
它正在通过分隔符go
进行拆分,基本上它会捕获整个世界并忽略#go
或--go
等特殊字符,因此它不会考虑这些分隔符。
我现在需要忽略评论中的分隔符,例如:select 'something go something' from table1 go --
它应该只找到一个分隔符并返回select 'something go something' from table 1
和--
。任何帮助将不胜感激,谢谢。
- ...更新上述问题:
@randomducks,感谢您的提示,我可以测试解决方案的工作正常。
现在我有以下模式:
(?=(([^']+'){2})*[^']*$)(?iu)[(?=\s)]\bgo\b(?!\S)|^go|go$
(?=(([^']+'){2})*[^']*$)
:忽略引用文字
(?iu)[(?=\s)]\bgo\b(?!\S)
:catch delimiter“go”
|^go|go$
:也捕获字符串/行分隔符的开头和结尾。
知道我需要的是忽略注释中的分隔符,比如/ * go * /。我尝试调整上面的模式来做到这一点,但到目前为止没有运气。
答案 0 :(得分:1)
如果您使用正则表达式分裂字符串,一种可能的解决方案可能是使用正则表达式来检查@anubhava在此处提到的偶数引号:https://stackoverflow.com/a/10864960/2788862
对于您的问题,解决方案将是
(?=(([^']+'){2})*[^']*$)(?iu)[(?=\s)]\bgo\b(?!\S)
You can see a working example of this here
更新:
如果不需要它们,您可能需要考虑删除多行注释,然后使用正则表达式来分离SQL语句。点击此处查看更多信息:http://ostermiller.org/findcomment.html
如果你真的想要包含多行注释,那么正则表达式可能不是最好的解决方案。也许手动解析字符串可以更好地满足您的需求。虽然我从未使用它,但我怀疑antlr3之类的东西可以起作用。