[英]How to use .matches for string containing .* in between characters in java
String str1 = "My hobby is playing \"Tennis\" I am good at it. I love it."
String str2 = "My hobby is playing \"Tennis\". I (Alex) am good at it. I(Alex) love it. "
我想检查str1是否与除Alex部分之外的str2匹配。
注意 - 亚历克斯是一个变化的部分。 可能是汤姆,哈里等。
所以我试过: -
str2 = "My hobby is playing \"Tennis\". I (.*) am good at it. I(.*) love it. "
str1.matches(str2)
但它返回false。
我在这做错了什么?
它适用于: -
str2 = "My hobby is playing \"Tennis\". I (.*)
你的正则表达式将匹配“I”和“am”之间的两个空格,因此它不匹配字符串
"My hobby is playing \"Tennis\" I am good at it. I love it."
因为那里只有一个空白。 而且,你在“网球”之后错过了点。 但是,要注意“。” 在正则表达式中有特殊含义。 所以你想在你的正则表达式中逃脱点
尝试:
"My hobby is playing \"Tennis\"\\. I (?:\\(.*\\) )?am good at it\\. I (?:\\(.*\\) )?love it\\."
以上将匹配两者:
My hobby is playing "Tennis". I am good at it. I love it.
My hobby is playing "Tennis". I (Alex) am good at it. I (Alex) love it.
你需要一个可以匹配不同部分的正则表达式。 这里的变化部分是带括号的名称。 该部分可能在字符串中,也可能不存在。 名称,可以是任何英文字母字符串。 所以你想匹配[open-bracket][any string of alphabets][close bracket]
。 让我们为此构建一个正则表达式。 两个句子的正则表达式I am good at it
并且I love it
是相同的,所以你只需要复制它。 现在:
1.可以有0或1个开放式支架。 如果你根本没有提到名字,则为0,否则为1。 正则表达式是这样的: [(]?
类似的关闭括号,你需要[)]?
。
2.必须有后至少1个空格I
和前一个am
。 为此,我们需要\\s+
,但我们需要转义\\
,因此一个或多个空格的正则表达式成为\\\\s+
。 同样,在I
和love
之前的一个空间。
3.然后,你需要一个正则表达式匹配的英语名称/词。 那只是[a-zA-Z]*
。
4.最后,上述所有内容可能也可能不在句子中,因此我们将上面构建的正则表达式包含在内,就像这个[regex-built-above]*
。 这确保了带括号的名称也可以不存在。
5.您需要逃脱.
和\\
。
最后, str2
应该是:
String str2 = "My hobby is playing \\"Tennis\\"\\\\. I[\\\\s+[(]?[a-zA-Z]*[)]?\\\\s+]* am good at it\\\\. I[\\\\s+[(]?[a-zA-Z]*[)]?\\\\s+]* love it\\\\."
它将匹配以下任何str1
:
str1 = "My hobby is playing \\"Tennis\\". I (Alex) am good at it. I (Alex) love it."
str1 = "My hobby is playing \\"Tennis\\". I am good at it. I love it."
如果有帮助,请告诉我。 它对我有用..
有用的资源:
1. http://www.tutorialspoint.com/java/java_regular_expressions.htm
2. http://www.tutorialspoint.com/java/java_string_matches.htm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.