Java 要匹配简单降价的regexp
我试图找出regexp来匹配所有出现的Java 要匹配简单降价的regexp,java,regex,Java,Regex,我试图找出regexp来匹配所有出现的*这类字符串*。不幸的是,另外两条规则使事情比我想象的更复杂: 带标记的字符串应以*开头,后跟非空白字符(因此*这一个*不应匹配) 带标记的字符串应以非空格结尾,后跟*和空格(因此*这一个*和*这一个不应匹配) 我从最简单的regexp\*\S([^\*]+)?\*开始,它用于我的测试字符串: *foo 1*2 bar*foo*b*azz*qu**ux* 匹配方括号中的位置: [*foo 1*]2 bar*foo[*b*]azz[*qu*][*ux*] 这就
*这类字符串*
。不幸的是,另外两条规则使事情比我想象的更复杂:
*
开头,后跟非空白字符(因此*这一个*
不应匹配)*
和空格(因此*这一个*
和*这一个
不应匹配)\*\S([^\*]+)?\*
开始,它用于我的测试字符串:
*foo 1*2 bar*foo*b*azz*qu**ux*
匹配方括号中的位置:
[*foo 1*]2 bar*foo[*b*]azz[*qu*][*ux*]
这就是我想要实现的目标:
[*foo 1*2 bar*]foo[*b*]azz[*qu**ux*]
因此出现了两个问题:
- 如何在regexp中表示2中的规则。“搜索到第一个非空格后跟
后跟空格出现”?正向前瞻*
- 如何匹配规则2中的空白,但不将其包含到结果中,哪个
可以\*\S([^\*]+)?\*\S
*
开始匹配,可以使用
\*(?=[^\s*]).*?(?<=[^\s*])\*(?!\S)
请参阅开始处的and.Add(?s)
,或使用模式.DOTALL进行编译,以跨行匹配文本
详细信息
\*
-a*
字符
(?=[^\s*])
-下一个字符必须是非空白字符,而不是*
*?
-任何0+字符尽可能少
(?我使用了完全匹配,而不是组,它完美地匹配了您的测试字符串:
"(?<=\\s|^)\\*(?:\\S|\\S.*?\\S)\\*(?=\\s)"
(?公共类测试{
公共静态void main(字符串[]args){
Pattern=Pattern.compile(“\\*\\S.*”(?您可以使用正则表达式:
\*(?!\s)(*?)?
如何在regexp中表示2中的规则。“搜索到第一个非空格后跟*后跟空格出现”?正向前瞻
只有在最后一个星号前面有非空白字符时,才可以使用负前视来匹配星号;在后面有空白字符或字符串结尾时,可以使用正前视来匹配星号
如何匹配规则2中的空白,但不将其包含在结果中,哪一个*\S([^*]+)?*\S可以
如果您想检查模式
后面是否有字符而不使用它,您可以使用先行检查,例如模式(?=\s)
不会使用\s
而不是模式
请澄清像*1**2*
和**1*
?[*1**2*]
因为2*
是字符串中遵循“非空格后跟*
后跟空格”规则的第一个结束符。与第二个示例相同:[**1*]
那么您想完全匹配这两种情况吗?是的,这些情况应该完全匹配。对于****foo 1*2条*
?整个字符串还是*foo 1*2条*
?
String regex = "\\*(?=[^\\s*]).*?(?<=[^\\s*])\\*(?!\\S)";
"(?<=\\s|^)\\*(?:\\S|\\S.*?\\S)\\*(?=\\s)"
public class Test {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\*\\S.*?(?<!\\s)\\*(?=\\s|$)");
Matcher matcher = pattern.matcher("*foo 1 * 2 bar* foo *b* azz *qu **ux*");
int i = 1;
while(matcher.find()) {
System.out.printf("%d: %s%n", i++, matcher.group());
}
}
}
\*(?!\s)(.*?)(?<!\s|\*)\*(?=\s|$)