[英]Regex is matching second occurence. I need it to match first occurence
[英]Need regex to match first occurence of a character in a string
我有一个 sql 查询作为字符串,我需要一个正则表达式来匹配字符串中的第一个问号 (?)
select * from something where a = ? and b=? and c=?
正则表达式应该只匹配第一次出现的问号。 我将在 Neo4j-apoc 库( apoc.text.replace 函数)中使用这个正则表达式。 与 Perl/Java 等不同,这个库不提供任何标志或 api 来获得第一个匹配。 所以我必须完全依赖正则表达式来匹配第一个字符。
我已经尝试了下面的一些正则表达式,但没有运气
这些正则表达式不匹配
(?<=^[^?]{0,1000})[?]
这些正则表达式匹配所有不存在的字符和所有问号
[?]?
([?])?
([\?])?
([\?])??
([?])*?
这些正则表达式匹配所有问号
([?])+?
[?]+?
有人可以帮我写这个正则表达式吗?
好吧,我想出了一个奇怪的解决方案,但也许你会这样:
(?<!\\?)\\?{1}(?!.*?\\?)|(?<=\\?)\\?{1}(?!.*?\\?)
只会匹配最后一个?
.
因此,虽然您无法直接找出第一个,但您可以反转字符串,然后找到最后一个。
我使用Regex101来测试它。
[更新]:
它找到最后一次出现的?
在\\n
之前。
如果您的正则表达式引擎支持正向后视(?<
,仅选择您可以使用的第一个问号:
(?<=where a = )\\?
或者没有 where (?<=a = )\\?
你不能像量词使用反向预搜索(?<=^[^?]{0,1000})
在这种情况下(至少在regex101.com 中),您会收到一条错误消息: {0,1000} A quantifier inside a lookbehind makes it non-fixed width
。
匹配第一个?
你可以使用^[^?]*(\\?)
,意思是:
^
- 字符串的开始。[^?]*
- 除?
以外的(可能为空的)字符序列 .(\\?)
- 要捕获的字符。 第一个?
将是第一个捕获组的内容。
另一种解决方案,如果您使用正则表达式的PCRE版本,则可能:
^[^?]*\K\?
意义:
^[^?]*
- 匹配除?
以外的“初始”字符序列 .\\K
- “忘记”您到目前为止匹配的内容并从这里开始匹配。\\?
- 匹配?
. 这样你的整场比赛都是第一?
,没有任何捕获组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.