Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,我有一个如下所示的字符串: *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中)效果很好,但再次感谢你