gpt4 book ai didi

java - 匹配字符串中第一次出现的分号,前提是前面没有 '--'

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:12 24 4
gpt4 key购买 nike

我正在尝试为 Java 编写一个正则表达式,如果分号没有两个(或更多)前导“-”字符,则匹配。

我只能得到相反的结果:分号至少有两个前导“-”字符。

([\-]{2,}.*?;.*)

但是我需要类似的东西

([^([\-]{2,})])*?;.*

我不知何故无法表达“至少两个字符”。

下面是一些我需要用表达式求值的例子:

; -- a           : should match
-- a ; : should not match
-- ; : should not match
--; : should not match
-;- : should match
---; : should not match
-- semicolon ; : should not match
bla ; bla : should match
bla : should not match (; is mandatory)
-;--; : should match (the first occuring semicolon must not have two or more consecutive leading '-')

最佳答案

看来这个正则符合你的要求

String regex = "[^-]*(-[^-]+)*-?;.*";

DEMO

解释:matches将接受以下字符串:

  • [^-]*可以以非破折号字符开头
  • (-[^-]+)*-?;有点棘手,因为在我们匹配 ; 之前我们需要确保每个 -没有另一个-在它之后:
    • (-[^-]+)*每个-至少有一个非-后面的字符
    • -?-被放在;之前
  • ;.*如果满足先前的条件,我们可以接受 ;和任何 .*它后面的字符。

更具可读性的版本,但可能会慢一些

((?!--)[^;])*;.*

解释:

确保有 ;在字符串中我们可以使用 .*;.*在比赛中。
但是我们需要在第一个;之前对字符添加一些条件.

所以要确保匹配 ;将是第一个我们可以编写这样的正则表达式的

[^;]*;.*

这意味着:

  • [^;]*零个或多个非分号字符
  • ;第一个分号
  • .*零个或多个任何字符(实际上 . 不能匹配像 \n\r 这样的行分隔符)

所以现在我们需要做的就是确保字符匹配 [^;]不属于 -- .为此,我们可以使用 look-around机制例如:

  • (?!--)[^;]匹配前[^;] (?!--)检查接下来的两个字符是否不是 -- ,换句话说,与 [^;] 匹配的字符不能是第一个-两个系列 --
  • [^;](?<!--)检查匹配后是否 [^;]正则表达式引擎将无法找到 --如果它会回溯两个位置,换句话说 [^;]不能是 -- 系列中的最后一个字符.

关于java - 匹配字符串中第一次出现的分号,前提是前面没有 '--',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com