Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匹配字符串中第一次出现的分号,前提是前面没有'--';_Java_Regex - Fatal编程技术网

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

Java 匹配字符串中第一次出现的分号,前提是前面没有'--';,java,regex,Java,Regex,我正在尝试为Java编写一个正则表达式,如果分号没有两个(或更多)前导“-”字符,则该表达式将匹配该分号 ([\-]{2,}.*?;.*) 我只能得到相反的结果:一个至少有两个前导'-'字符的分号 ([\-]{2,}.*?;.*) 但我需要像这样的东西 ([^([\-]{2,})])*?;.* 不知何故,我无法表达“至少两个字符” 以下是我需要使用表达式计算的一些示例: ; -- a : should match -- a ; : should no

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

([\-]{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.那很好;但是,如果是为了可读性,这些答案中的一些可读性要差得多(如果你关心可理解性的话)两到三个电话让任务变得明显。你使用了哪种软件?