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

时间:2018-02-22 05:39:06

标签: regex regex-lookarounds regex-group neo4j-apoc

我有一个sql查询作为字符串,我需要一个正则表达式来匹配字符串中的第一个问号(?)

select * from something where a = ? and b=? and c=?

正则表达式应仅匹配第一次出现的问号。我将在Neo4j-apoc库(apoc.text.replace function)中使用此正则表达式。与Perl / Java等不同,此库不提供任何标记或api来获得第一个匹配。所以我必须完全依赖正则表达式来匹配第一个字符。

我尝试过以下一些正则表达式,但没有运气

这些正则表达式不匹配

(?<=^[^?]{0,1000})[?]

这些正则表达式匹配所有不存在的字符和所有问号

[?]?
([?])?
([\?])?
([\?])??
([?])*?

这些正则表达式匹配所有问号

([?])+?
[?]+?

有人可以帮我写这个正则表达式吗?

4 个答案:

答案 0 :(得分:1)

我想出了一个奇怪的解决方案,但也许你接受这个:
    ?
将仅匹配最后 ? 所以,虽然你不能直接找到第一个,你可以反转你的字符串,然后找到最后一个。
我用Regex101来测试它。

<强> [UPDATE]:
它会在\n之前找到{{1}}的最后次。

答案 1 :(得分:0)

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

您可以使用$2

获得第一个问号

Online demo

答案 2 :(得分:0)

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

(?<=where a = )\?或没有(?<=a = )\?

答案 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;到目前为止你所匹配的内容并从这里开始匹配。
  • \? - 匹配?

这样,整个匹配是第一个?,没有任何捕获组。