如何增强Java模式,使其在匹配周围也包含特殊字符?
我有一个如下所示的字符串:如何增强Java模式,使其在匹配周围也包含特殊字符?,java,regex,Java,Regex,我有一个如下所示的字符串: *to *make/to *have *a *dab *at *smb. (\*dictionary) some text without special symbols at the begging. 目标是从字符串中提取带前导*符号的单词,我的方法如下: Matcher matcher = Pattern.compile("[*]\\s*(\\w+)").matcher(input); while (matcher.find()) { p
*to *make/to *have *a *dab *at *smb. (\*dictionary) some text without special symbols at the begging.
目标是从字符串中提取带前导*
符号的单词,我的方法如下:
Matcher matcher = Pattern.compile("[*]\\s*(\\w+)").matcher(input);
while (matcher.find()) {
phrase += matcher.group(1) + " ";
}
输出如下所示:
to make have a dab at smb dictionary
我确实理解为什么不包括括号(它们与模式不匹配),但有人能向我解释一下为什么/to
部分不匹配吗
是否有任何方法来增强我的模式,使其包括比赛周围的特殊字符(如果存在的话)
预期输出:
to make/to have a dab at smb. (dictionary)
您可以将此正则表达式与两个捕获组一起使用,以查找所有非空白文本,下一个和前一个
*
(\S*)\*\s*(\S+)
您需要在while
循环中组合.group(1)
和.group(2)
对于Java,请使用以下正则表达式声明:
final String regex = "(\\S*)\\*\\s*(\\S+)";
因为
\w
表示任何单词字符[a-zA-Z0-9.]
。您需要改为使用\S
,这意味着任何非空格字符,但也要注意它是否匹配)
。@revo您说得对,谢谢您的评论为什么两组?因为OP希望在预期输出中获取*
之前的非空格字符,例如(字典)
。有了这个想法,您考虑的是\*\S*
之后的任何\S
字符,而不是\S*\*
之前的任何\S
字符。这意味着(\*dictionary)
是部分匹配。完全正确,但提出这个想法的人是你。@revo刚才在这里读了你的评论,现在我明白你说的了,但在我的输入中,我可以保证不会有任何*后跟空格,所以答案在给定的示例中(以及在我所有的输入t.b.h中)效果很好,但再次感谢你