如果我有一个字符串:
This.is.a.great.place.too.work.
或:
This/is/a/great/place/too/work/
比我的程序应该告诉我这句话是有效的并且它有“工作”。
如果我有:
This.is.a.great.place.too.work.hahahha
或:
This/is/a/great/place/too/work/hahahah
然后我的程序不应该告诉我句子中有“工作”。
所以我正在查看java字符串,以便在其前面的。或,或 / 之前找到一个单词。 。我怎样才能做到这一点?
答案 0 :(得分:77)
根据您的问题,您似乎想要/
,,
或.
作为分隔符集。
所以:
String str = "This.is.a.great.place.to.work.";
if (str.endsWith(".work.") || str.endsWith("/work/") || str.endsWith(",work,"))
// ...
您也可以使用matches
方法和相当简单的正则表达式执行此操作:
if (str.matches(".*([.,/])work\\1$"))
使用指定句点,斜杠,逗号和反向引用的字符类[.,/]
,\1
匹配找到的替代项中的任何一项(如果有)。
答案 1 :(得分:40)
您可以测试字符串是否以 work 结尾,后跟一个字符,如下所示:
theString.matches(".*work.$");
如果尾随字符可选,您可以使用:
theString.matches(".*work.?$");
要确保最后一个字符是句点.
或斜杠/
,您可以使用此字符:
theString.matches(".*work[./]$");
要测试工作后跟可选期间或斜杠,您可以使用此功能:
theString.matches(".*work[./]?$");
要按或斜杠测试工作 包围,您可以这样做:
theString.matches(".*[./]work[./]$");
如果之前和之后的令牌 必须相互匹配,您可以这样做:
theString.matches(".*([./])work\\1$");
您的确切要求并未精确定义,但我认为它会是这样的:
theString.matches(".*work[,./]?$");
换句话说:
,
.
或 /
各种正则表达式项目的说明:
. -- any character
* -- zero or more of the preceeding expression
$ -- the end of the line/input
? -- zero or one of the preceeding expression
[./,] -- either a period or a slash or a comma
[abc] -- matches a, b, or c
[abc]* -- zero or more of (a, b, or c)
[abc]? -- zero or one of (a, b, or c)
enclosing a pattern in parentheses is called "grouping"
([abc])blah\\1 -- a, b, or c followed by blah followed by "the first group"
这是一个可以玩的测试工具:
class TestStuff {
public static void main (String[] args) {
String[] testStrings = {
"work.",
"work-",
"workp",
"/foo/work.",
"/bar/work",
"baz/work.",
"baz.funk.work.",
"funk.work",
"jazz/junk/foo/work.",
"funk/punk/work/",
"/funk/foo/bar/work",
"/funk/foo/bar/work/",
".funk.foo.bar.work.",
".funk.foo.bar.work",
"goo/balls/work/",
"goo/balls/work/funk"
};
for (String t : testStrings) {
print("word: " + t + " ---> " + matchesIt(t));
}
}
public static boolean matchesIt(String s) {
return s.matches(".*([./,])work\\1?$");
}
public static void print(Object o) {
String s = (o == null) ? "null" : o.toString();
System.out.println(o);
}
}
答案 2 :(得分:2)
当然,您可以使用StringTokenizer
类将字符串与'。'分开。或'/',并检查最后一个单词是否为“work”。
答案 3 :(得分:2)
您可以使用子字符串方法:
String aString = "This.is.a.great.place.too.work.";
String aSubstring = "work";
String endString = aString.substring(aString.length() -
(aSubstring.length() + 1),aString.length() - 1);
if ( endString.equals(aSubstring) )
System.out.println("Equal " + aString + " " + aSubstring);
else
System.out.println("NOT equal " + aString + " " + aSubstring);
答案 4 :(得分:0)
我尝试了这里提到的所有不同的东西来获得“。”的索引。文件名中以。[0-9] [0-9] *结尾的字符,例如srcfile.1,srcfile.12等没什么用的。最后,以下工作: int dotIndex = inputfilename.lastIndexOf(“。”);
奇怪!这是用java -version openjdk版本“1.8.0_131” OpenJDK运行时环境(版本1.8.0_131-8u131-b11-0ubuntu1.16.10.2-b11) OpenJDK 64位服务器VM(内置25.131-b11,混合模式)
此外,正则表达式的官方Java文档页面(上面的一个答案中有引用)似乎没有指定如何查找“。”字符。因为“。”,“\。”和“[。]”对我不起作用,除了这些之外我没有看到任何其他选项。
答案 5 :(得分:0)
String input1 = "This.is.a.great.place.too.work.";
String input2 = "This/is/a/great/place/too/work/";
String input3 = "This,is,a,great,place,too,work,";
String input4 = "This.is.a.great.place.too.work.hahahah";
String input5 = "This/is/a/great/place/too/work/hahaha";
String input6 = "This,is,a,great,place,too,work,hahahha";
String regEx = ".*work[.,/]";
System.out.println(input1.matches(regEx)); // true
System.out.println(input2.matches(regEx)); // true
System.out.println(input3.matches(regEx)); // true
System.out.println(input4.matches(regEx)); // false
System.out.println(input5.matches(regEx)); // false
System.out.println(input6.matches(regEx)); // false