【问题标题】:Java regex expression trouble in split function call拆分函数调用中的Java正则表达式问题
【发布时间】:2015-07-21 22:55:46
【问题描述】:

我在 java 中创建正则表达式时遇到了一些问题,我希望它匹配字符串中包含单个 ; 且字符串中没有一个 ;; 的所有部分。

例如在字符串today;i;;drank water 中,今天之后的; 将是匹配项,而;; 将不是匹配项。到目前为止,我已经尝试使用正则表达式 ;{1} 来表示匹配一个且只有一个 ;

但它一直匹配双精度 ;;。正则表达式;{1,2} 也是如此,它表示匹配一个;,但不匹配两个或更多;。两个正则表达式都属于 greedy 类型。我也在使用带有String.split(regular expression) java 函数的正则表达式。

任何人都可以帮助解决可能出现的问题,或者如果我对正则表达式形成的理解有点偏离,为什么我的正则表达式不能正常工作?

另外值得注意的是,我从拆分中得到的输出与 today;i;;drank water 一样

today
i

drank water

如果拆分数组字符串中有空格,则为第三个元素。

【问题讨论】:

  • 你知道格式化文本可以减少麻烦吗?
  • 你不想在第二部分匹配 ;d?
  • 不知道是不是合法表达,你可以试试;{1,1}
  • @Suspended 得到相同的输出,但值得一试
  • @Suspended: 是,但也没用(和;;{1}一样)

标签: java regex string split regex-greedy


【解决方案1】:

您可以使用以下表达式:\b;\b。一个例子是可用的here

String str = "today;i;;drank water";
        String[] split = str.split("\\b;\\b");
        for(String s : split)
            System.out.println(s);

产量:

today
i;;drank water

【讨论】:

  • 成功了!感谢您的帮助,我知道简单的正则表达式,但不是高手,所以有时这些类型会给我带来麻烦,因为我不必经常使用它们!
  • @jgr208:当它们中的几个在你的脸上爆炸时,你通常会掌握它们的窍门:)
【解决方案2】:

另一种方法是使用否定的前瞻/后瞻:

(?<!;);(?!;)

这意味着:分号之前没有分号。

现场示例:https://regex101.com/r/cB7oJ7/1

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多