1

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

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

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

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

这些正则表达式不匹配

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

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

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

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

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

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

4

4 回答 4

1

好吧,我想出了一个奇怪的解决方案,但也许你会接受这个:
(?<!\?)\?{1}(?!.*?\?)|(?<=\?)\?{1}(?!.*?\?)
将只匹配最后一个 ?.
所以,虽然你不能直接找出第一个,但你可以反转你的字符串,然后找到最后一个。
我用Regex101来测试它。

[更新]:
它找到a 之前的最后一次出现。?\n

于 2018-02-22T06:42:18.930 回答
0

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

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

在线演示

于 2018-02-22T06:29:01.833 回答
0

您不能将lookbehind与量词一起使用,例如(?<=^[^?]{0,1000}).

在这种情况下(至少在regex101.com中),您会收到一条错误消息: {0,1000} A quantifier inside a lookbehind makes it non-fixed width.

要匹配第一个 ?,您可以使用^[^?]*(\?),这意味着:

  • ^- 字符串的开始。
  • [^?]*- 一个(可能为空的)字符序列,而不是?.
  • (\?)- 您要捕获的字符。

第一个?将是第一个捕获组的内容。

编辑

如果您使用正则表达式的PCRE版本,则可能是另一种解决方案:

^[^?]*\K\?

意义:

  • ^[^?]*- 匹配除 . 之外的“初始”字符序列?
  • \K- “忘记”你到目前为止匹配的内容,从这里开始匹配。
  • \?- 匹配?

这样你的整个比赛是第一个?,没有任何捕获组。

于 2018-02-22T07:15:13.593 回答
0

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

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

于 2018-02-22T06:42:42.513 回答