当开始或结束为空时,正则表达式不匹配

时间:2016-03-15 03:02:07

标签: java regex string

这是我的正则表达式,因为我已将其输入到我的java文件中。

String myRegex = "(?<=[^a-zA-Z0-9])(target)(?=[^a-zA-Z0-9])";

如果我有一个字符串如下:

.target. - 它有效。

但是,如果我有一个JUST说target的字符串,它就不起作用。如何修改正则表达式,以便如果字符串的开头或结尾没有任何内容,它仍然匹配?

编辑 - 示例。

_target - 应该成功!

target_ - 应该成功!

target - 应该成功!

目前这些示例因当前的正则表达式而失败。

4 个答案:

答案 0 :(得分:2)

问题是,这里有两个负面因素。我的外表可能是负面的,我的角色类可能是负面的。目前,我的外表是积极的,我的角色类是负面的。所以它说:&#34;向后看,确保找到不属于这些类的东西&#34;。所以当你在那里什么都没有时,它就找不到它而且会失败。解决方案是让我看起来是消极的,并使角色类积极。所以现在它说&#34;看看后面,确定有ISN&#39; T这些角色中的任何一个&#34;。因此,如果它是空的,它就会因为满足条件而失败。

这是最终的正则表达式:

String myRegex = "(?<![a-zA-Z0-9])target(?![a-zA-Z0-9])";

答案 1 :(得分:2)

添加&#34;开始输入&#34;在你的背后,添加&#34;输入结束&#34;使用正则表达式交替(即|,这是一个逻辑&#34;或&#34;):

String myRegex = "(?<=^|[^a-zA-Z0-9])target(?=[^a-zA-Z0-9]|$)";

你的正则表达式的问题在于你在后面的需要那里有一个不是字母/数字的前面的字符。

这些环顾四周也匹配输入的开始/结束。

请参阅live demo

答案 2 :(得分:0)

如果我正确理解您的问题,您可以使用?来表示应该有0或1个非字母或数字字符,而不是使用前瞻和后视之后&#34;目标&#34;。

([^a-zA-Z0-9])?(target)([^a-zA-Z0-9])?

答案 3 :(得分:0)

您应该能够使用* 0或更多量词来匹配目标,以匹配任何出现0个或更多个字符的目标。所以:

[_]*(target)[_]*

应匹配:

_target
target
target_
_target_

将要在字词之前或之后匹配的任何元素添加到括号中。匹配.target.的示例:

[\._]*(target)[\._]*

这将匹配目标子字符串,无论字符串的哪个部分。如果您只想在字符串开头处为匹配项生成规则,请将^锚点添加到其中,如:

^[\._]*(target)[\._]*

并且只有在他们开始字符串时才会匹配上面提到的那些。