我有一个sql查询作为字符串,我需要一个正则表达式来匹配字符串中的第一个问号(?)
select * from something where a = ? and b=? and c=?
正则表达式应仅匹配第一次出现的问号。我将在Neo4j-apoc库(apoc.text.replace function)中使用此正则表达式。与Perl / Java等不同,此库不提供任何标记或api来获得第一个匹配。所以我必须完全依赖正则表达式来匹配第一个字符。
我尝试过以下一些正则表达式,但没有运气
这些正则表达式不匹配
(?<=^[^?]{0,1000})[?]
这些正则表达式匹配所有不存在的字符和所有问号
[?]?
([?])?
([\?])?
([\?])??
([?])*?
这些正则表达式匹配所有问号
([?])+?
[?]+?
有人可以帮我写这个正则表达式吗?
答案 0 :(得分:1)
我想出了一个奇怪的解决方案,但也许你接受这个:
?
将仅匹配最后 ?
所以,虽然你不能直接找到第一个,你可以反转你的字符串,然后找到最后一个。
我用Regex101来测试它。
<强> [UPDATE]:强>
它会在\n
之前找到{{1}}的最后次。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您的正则表达式引擎支持positive lookbehind (?<
,则只选择您可以使用的第一个问号:
答案 3 :(得分:0)
您不能将{em> lookbehind 与(?<=^[^?]{0,1000})
等量词一起使用。
在这种情况下(至少在 regex101.com 中),您会收到一条错误消息:
{0,1000} A quantifier inside a lookbehind makes it non-fixed width
。
要匹配第一个 ?
,您可以使用^[^?]*(\?)
,意思是:
^
- 字符串的开头。[^?]*
- 除?
以外的一个(可能是空的)字符序列。(\?)
- 您要捕获的字符。第一个?
将是第一个捕获组的内容。
另一种解决方案,如果您使用 PCRE 版本的正则表达式,则可能
^[^?]*\K\?
含义:
^[^?]*
- 匹配&#34;初始&#34;除?
以外的字符序列。\K
- &#34;忘了&#34;到目前为止你所匹配的内容并从这里开始匹配。\?
- 匹配?
。这样,整个匹配是第一个?
,没有任何捕获组。