繁体   English   中英

需要正则表达式来匹配字符串中字符的第一次出现

[英]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之前。

你可以使用([^?]+)(\\?)(.+)

你可以用$2得到第一个问号

在线演示

如果您的正则表达式引擎支持正向后视(?< ,仅选择您可以使用的第一个问号:

(?<=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM