Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.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,我正在寻找一个单一的正则表达式,它将匹配任何句子,其中包含一个“新”字,然后是“ee”非单词边界。下面是我在非单词边界之前或之后放置的任何内容返回False的代码 String sa = "this is new freeCode "; System.out.println(sa.matches(".*\\s\\bnew\\b\\sfre.*")); //True System.out.println(sa.matches(".*\\s\\Bee\\B\\s.*")); //False

我正在寻找一个单一的正则表达式,它将匹配任何句子,其中包含一个“新”字,然后是“ee”非单词边界。下面是我在非单词边界之前或之后放置的任何内容返回False的代码

String sa = "this is new freeCode ";
System.out.println(sa.matches(".*\\s\\bnew\\b\\sfre.*")); //True
System.out.println(sa.matches(".*\\s\\Bee\\B\\s.*"));     //False
System.out.println(sa.matches(".*\\Bee\\B.*"));           //True
你可以试试这个。看演示


这将匹配单词
new
,然后匹配
ee
,两边都没有
单词边界。

以下是这些测试产生这些结果的原因:

System.out.println(sa.matches(“.*\\s\\bnew\\b\\sfre.”)//正确

这是新的自由代码
包含
某些内容
+
空白
+
单词边界
+
新的
+
单词边界
+
空白
+
fre
+
某些内容
。单词边界在
n
wf
之间匹配

System.out.println(sa.matches('.\\s\\Bee\\B\\s.')//错误

\s
e
之间的非单词边界
\B
无法匹配,因为
e
是单词字符。因此,没有对手

System.out.println(sa.matches(“.\\Bee\\B.”)//正确

非单词边界
\B
e
之间匹配,因为
e
freecode
中不在单词边界位置(它在两个字母之间,单词字符),最后的
e
后面再次跟一个字母(在这种情况下是
c
)。这是一个有效的匹配项

要启用这两种检查,需要组合第一个和第三个正则表达式模式。您不需要同时使用
\s\b
\b\s
。如果只想匹配整个单词
new
删除
\s

System.out.println(sa.matches(".*\\bnew\\b.*\\Bee\\B.*"));
如果需要匹配
new
周围的空格,请使用:

System.out.println(sa.matches(".*\\snew\\s.*\\Bee\\B.*"));

打扰一下,问题是什么?为什么会得到
True
False
True
?第一个正则表达式将单词边界与空格匹配,这给了我True,我对此很满意,在第二种情况下,非单词边界与空格不起作用,因此我无法构造一个正则表达式,它将匹配具有“new”单词边界的字符串,然后是“ee”非单词边界。尝试此。*新。*免费[^]您能提供有效和无效输入的示例吗?我觉得您正在寻找类似于
“*\\snew\\s.\\Bee\\B.*”
的东西。在
\snew\s
中不需要
\b
,因为在
\s
n
之间有一个单词边界。这是多余的。“这是新的自由码”--有效字符串“这是新的旧的自由码”--无效字符串
System.out.println(sa.matches(".*\\snew\\s.*\\Bee\\B.*"));