Java 匹配字符串中第一次出现的分号,前提是前面没有'--';
我正在尝试为Java编写一个正则表达式,如果分号没有两个(或更多)前导“-”字符,则该表达式将匹配该分号Java 匹配字符串中第一次出现的分号,前提是前面没有'--';,java,regex,Java,Regex,我正在尝试为Java编写一个正则表达式,如果分号没有两个(或更多)前导“-”字符,则该表达式将匹配该分号 ([\-]{2,}.*?;.*) 我只能得到相反的结果:一个至少有两个前导'-'字符的分号 ([\-]{2,}.*?;.*) 但我需要像这样的东西 ([^([\-]{2,})])*?;.* 不知何故,我无法表达“至少两个字符” 以下是我需要使用表达式计算的一些示例: ; -- a : should match -- a ; : should no
([\-]{2,}.*?;.*)
我只能得到相反的结果:一个至少有两个前导'-'字符的分号
([\-]{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 '-')
你需要一个消极的前瞻 此正则表达式将匹配任何不包含原始匹配模式的字符串:
(?!-{2,}.*?;.*).*?;.*
此正则表达式与包含分号的字符串相匹配,但分号不能出现在两个或多个破折号之后
示例:在Java中使用这个正则表达式怎么样:
[^;]*;(?<!--[^;]{0,999};).*
[^;]*;(?沿着--
拆分字符串怎么样?如果有两个或更多子字符串,检查最后一个是否包含分号?这个正则表达式似乎与您想要的匹配
String regex = "[^-]*(-[^-]+)*-?;.*";
说明:匹配项
将接受以下字符串:
[^-]*
可以以非破折号字符开头
([^-]+)*-?;
有点棘手,因为在匹配;
之前,我们需要确保每个-
后面没有另一个-
,因此:
([^-]+)*
每个-
后面至少有一个非-
字符
-?
或-
放在的正前方;
;..*
如果满足先前的条件,我们可以接受;
及其后的任何*
字符
更具可读性的版本,但可能稍慢一些
((?!-)[^;])*;*。
说明:
为了确保字符串中有;
,我们可以在匹配项中使用*;.*
。
但是我们需要在第一个;
之前为字符添加一些条件
因此,为了确保匹配的;
将是第一个,我们可以编写如下正则表达式
[^;]*;.*
这意味着:
[^;]*
零个或多个非分号字符
;
第一个分号
*
任何字符中的零个或多个(实际上
不能匹配行分隔符,如\n
或\r
)
因此,现在我们需要做的就是确保由[^;]
匹配的字符不是--
的一部分。为此,我们可以使用一些机制,例如:
(?!-)[^;]
在匹配[^;]
(?!-)
之前,检查接下来的两个字符是否不是-
,换句话说,[^;]
匹配的字符不能是两个-
序列中的第一个-
[^;](?我想这就是你要找的:
^(?:(?!--).)*;.*$
换句话说,从字符串的开头(^
)匹配,零个或多个字符(*
)后跟分号。但将点替换为(?:(?!))
会使它匹配任何字符,除非它是双连字符序列(-->
)的开头
如果性能是一个问题,您也可以排除分号,这样就不必回溯:
^(?:(?!--|;).)*;.*$
编辑:我刚刚注意到您的评论,即正则表达式应该与匹配项()一起使用
方法,所以我用*
填充了它。锚点不是真的必要,但它们没有害处。字符串中可以有多少分号?字符串像-;;;
正确吗?我们是否要禁止只引导-
?像x-;
这样的字符串呢?@Pshemo第一个必须匹配(相应地更新了我的问题).第二个必须不匹配,只是为了保持简单。否则我需要编写一个完整的解析器,这不是我的小应用程序的目的。谢谢,@anubhava。我更喜欢没有组的解决方案。但总的来说,你的解决方案是有效的。嗨,anubhava,我创建了一个几乎专门针对你的问题!哈哈。我真的很喜欢这个问题nhique.你能检查一下吗?我更喜欢只调用.matches()的解决方案,因为我的类中的所有其他语句都是这样工作的。只是为了阅读。@RichardW.那很好;但是,如果是为了可读性,这些答案中的一些可读性要差得多(如果你关心可理解性的话)两到三个电话让任务变得明显。你使用了哪种软件?