6

作为一个正则表达式的初学者,我相信我要问一些太简单的问题,但无论如何我都会问,希望它不会打扰你帮助我..

假设我有一个像“hello 'cool1' word!'cool2'”这样的文本 ,我想得到第一个引用的文本(这是没有'的'cool1')

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

(请仅使用正则表达式提出解决方案..)

4

3 回答 3

10

使用这个正则表达式:

'([^']*)'

使用如下:(ideone)

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

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

'(.*?)'

使用匹配器时,我如何保证它将保留第一个引号而不是第二个?

它将首先找到第一个引用的字符串,因为它从左到右开始搜索。如果您要求它进行下一次匹配,它将为您提供第二个带引号的字符串。

于 2012-05-26T21:15:37.187 回答
1

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

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

例如

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

更多信息

于 2012-05-26T21:19:52.070 回答
0

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

如果您坚持使用正则表达式,请尝试以下操作:

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

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

也支持双引号:

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

然后得到子模式2。

于 2012-05-26T21:16:10.577 回答