【问题标题】:Java: regex - how do i get the first quote textJava:正则表达式 - 我如何获得第一个引号文本
【发布时间】:2012-05-26 21:12:09
【问题描述】:

作为 regex 的初学者,我相信我要问一些过于简单的问题,但无论如何我都会问,希望它不会打扰你帮助我..

假设我有一个类似 "hello 'cool1' word! 'cool2'"的文本 我想得到第一个引号的文本(没有''的'cool1')

我的模式应该是什么?并且在使用匹配器时,我如何保证它将保留第一个引号而不是第二个?

(请建议仅使用正则表达式的解决方案..)

【问题讨论】:

标签: java regex


【解决方案1】:

使用这个正则表达式:

'([^']*)'

使用如下:(ideone)

Pattern pattern = Pattern.compile("'([^']*)'");
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
    System.out.println(matcher.group(1));
}

或者,如果您知道引用的字符串中没有换行符:

'(.*?)'

使用 matcher 时,我如何保证它会保留第一个引号而不是第二个?

它将首先找到第一个引用的字符串,因为它从左到右开始搜索。如果你要求它进行下一场比赛,它会给你第二个带引号的字符串。

【讨论】:

  • 您确定要在字符串周围加上"" 吗?是Java字符串还是?
  • @DavidB:是的,我假设它是作为 Java 字符串文字编写的。
  • IMO 我会简单地删除它们,这样新手就不会将其扔到 Java 中并想知道为什么他的正则表达式不匹配/他的 IDE 向他抛出非法转义。
  • @DavidB:更新为包含两个版本。
  • 马克,非常感谢,我有一个问题:一般来说,假设我有 2 种模式,一种是你写的,另一种是相同的想法,但用 " 而不是 ' 我想要要在两者之间使用 OR,我怎么知道两者之间建立的组是什么?换句话说,使用 find() 后我怎么知道找到了哪个组?
【解决方案2】:

如果您想在没有 ' 的情况下查找第一个引用的文本,您可以/应该使用 Lookahead 和 Lookbehind 机制,例如

(?<=').*?(?=')

例如

System.out.println("hello 'cool1' word! 'cool2'".replaceFirst("(?<=').*?(?=')", "ABC"));
//out -> hello 'ABC' word! 'cool2'

more info

【讨论】:

    【解决方案3】:

    您可以将字符串拆分为引号并获取第二部分(将在第一个和第二个引号之间)。

    如果你坚持使用正则表达式,试试这个:

    /^.*?'(.*?)'/
    

    确保它设置为多行,除非您知道输入中永远不会有换行符。然后,从结果中获取子模式,这将是您的字符串。

    也支持双引号:

    /^.*?(['"])(.*?)\1/
    

    然后得到子模式2。

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多