目标:对于给定的术语,我想检查该词的开头是否存在该术语。例如,如果该术语是“' t”。然后在发送中:
"这是困难的那就是#34;
我希望它返回" true "因为:
这,the,Thats
所以考虑一下:
public class HelloWorld{
public static void main(String []args){
String term = "t";
String regex = "/\\b"+term+"[^\\b]*?\\b/gi";
String str = "This is the difficult one Thats it";
System.out.println(str.matches(regex));
}
}
我正在关注例外:
Exception in thread "main" java.util.regex.PatternSyntaxException:
Illegal/unsupported escape sequence near index 7
/\bt[^\b]*?\b/gi
^
at java.util.regex.Pattern.error(Pattern.java:1924)
at java.util.regex.Pattern.escape(Pattern.java:2416)
at java.util.regex.Pattern.range(Pattern.java:2577)
at java.util.regex.Pattern.clazz(Pattern.java:2507)
at java.util.regex.Pattern.sequence(Pattern.java:2030)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.compile(Pattern.java:1665)
at java.util.regex.Pattern.<init>(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at java.util.regex.Pattern.matches(Pattern.java:1128)
at java.lang.String.matches(String.java:2063)
at HelloWorld.main(HelloWorld.java:8)
以下内容也不起作用:
import java.util.regex.*;
public class HelloWorld{
public static void main(String []args){
String term = "t";
String regex = "\\b"+term+"gi";
//String regex = ".";
System.out.println(regex);
String str = "This is the difficult one Thats it";
System.out.println(str.matches(regex));
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
System.out.println(m.find());
}
}
实施例: {这,一,二,那些,谢谢} 对于这两个人的感谢;结果应该是真的。
由于
答案 0 :(得分:1)
由于您正在使用Java正则表达式引擎,因此您需要以Java理解的方式编写表达式。这意味着删除尾部和前导斜杠,并在表达式的开头添加标记(?<flags>)
。
因此,您需要这样做:
String regex = "(?i)\\b"+term+".*?\\b"
有关详细信息,请查看regular-expressions.info/java.html。可以在此处找到支持功能的比较(仅作为切入点):regular-expressions.info/refbasic.html
答案 1 :(得分:1)
在Java中,我们不会使用/
包围正则表达式,因此我们只需编写"/regex/flags"
而不是regex
。如果您想添加标记,可以使用(?flags)
语法进行标记,并将其放在regex中应该应用标记的位置,例如a(?i)a
将能够找到aa
和{{ 1}}但不是aA
,因为在第一个Aa
之后添加了标记
你也可以将你的正则表达式编译成a
这样的
Pattern
其中Pattern pattern = Pattern.compile(regex, flags);
是String(再次没有用regex
括起来)和/
是来自Pattern flag
之类的常量的整数构建,或者当你需要更多的标志时你可以使用Pattern.DOTALL
。
可能让您感到困惑的下一件事是Pattern.CASE_INSENSITIVE|Pattern.MULTILINE
方法。大多数人都误以为它的名字,因为他们认为它会尝试检查它是否可以{reinx 匹配的字符串元素matches
,但实际上,它检查是否整个字符串可以由正则表达式匹配。
你似乎想要的是测试某些正则表达式的机制至少可以在字符串中找到一次。在这种情况下,您可以
find
,让其他不想要查找的元素的字符与正则表达式引擎匹配,但这种方式.*
必须遍历整个字符串< / LI>
matches
的{{1}}对象构建(代表您的正则表达式),并使用其Matcher
方法,该方法将迭代直到找到正则表达式的匹配,或者将找到字符串的结尾。我更喜欢这种方法,因为它不需要遍历整个字符串,但会在找到匹配时停止。 所以你的代码看起来像
Pattern
如果您的find()
可能包含一些正则表达式特殊字符,但您希望正则表达式引擎将它们视为普通字符,则需要确保它们将被转义。为此,您可以使用String str = "This is the difficult one Thats it";
String term = "t";
Pattern pattern = Pattern.compile("\\b"+term, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.find());
方法为您添加所有必要的转义,而不是
term
为了安全起见,你应该使用
Pattern.quote
答案 2 :(得分:0)
String regex = "(?i)\\b"+term;
在Java中,修饰符必须插入&#34;(?&#34;和&#34;)&#34;还有一个变种可以让它们再次关闭:&#34;(? - &#34;和&#34;)&#34;。
查找所有以&#34开头的单词; T&#34;或者&#34; t&#34;,您可能希望重复使用Matcher的find方法。如果您只需要偏移量,Matcher的start方法将返回偏移量。
如果您需要匹配完整的字词,请使用
String regex = "(?i)\\b"+term + "\\w*";
答案 3 :(得分:0)
String str = "This is the difficult one Thats it";
String term = "t";
Pattern pattern = Pattern.compile("^[+"+term+"].*",Pattern.CASE_INSENSITIVE);
String[] strings = str.split(" ");
for (String s : strings) {
if (pattern.matcher(s).matches()) {
System.out.println(s+"-->"+true);
} else {
System.out.println(s+"-->"+false);
}
}