检查字符串是不是以某种模式结束
Posted
技术标签:
【中文标题】检查字符串是不是以某种模式结束【英文标题】:Check if string ends with certain pattern检查字符串是否以某种模式结束 【发布时间】:2012-08-31 21:59:56 【问题描述】:如果我有这样的字符串:
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 字符串以在句子末尾找到一个单词,该单词前面有 .
或 ,
或 /
。我怎样才能做到这一点?
【问题讨论】:
您在下面有一些很好的答案,@Learner;您应该选择一个并将其标记为答案。 【参考方案1】:这很简单,String
对象有一个endsWith
方法。
从您的问题来看,您似乎想要/
、,
或.
作为分隔符集。
所以:
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
。
【讨论】:
似乎这些答案都没有像 OP 指定的那样在末尾解释额外的字符。 感谢 pb2q 回答问题,因为我不知道结尾字符是什么(我的问题是最后只有字符 (,/$..) 或可能没有但不会是一个词。所以在 java 中你能解释一下什么是 1$ @TheLearner 在正则表达式末尾有两个不同的东西:第一个是\1
,它是一个反向引用,指的是从正则表达式前面的字符集 [,./] 中匹配的任何字符;我们用括号包围该集合以将其分组为可参考:([,./])
。而$
只是表示行尾。【参考方案2】:
您可以测试一个字符串是否以 work 结尾,后跟一个字符,如下所示:
theString.matches(".*work.$");
如果尾随字符是可选,您可以使用:
theString.matches(".*work.?$");
要确保最后一个字符是句点.
或斜线/
,您可以使用:
theString.matches(".*work[./]$");
要测试 work 后跟 可选 句点或斜线,您可以使用:
theString.matches(".*work[./]?$");
要测试 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);
【讨论】:
这很有帮助,感谢您提供的信息丰富的回复。【参考方案3】:当然,您可以使用StringTokenizer
类将字符串与'.' 分开。或'/',并检查最后一个单词是否为“work”。
【讨论】:
【参考方案4】:可以使用substring方法:
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);
【讨论】:
【参考方案5】:我尝试了这里提到的所有不同方法来获取以.[0-9][0-9]*
结尾的文件名中的.
字符的索引,例如srcfile.1
、srcfile.12
等。没有任何效果。最后,以下工作:
int dotIndex = inputfilename.lastIndexOf(".");
奇怪!这是 java -version:
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-0ubuntu1.16.10.2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
此外,regex
的官方 Java 文档页面(在上面的答案之一中有一个引用)似乎没有指定如何查找 .
字符。因为\.
、\\.
和[.]
对我不起作用,除此之外我没有看到任何其他选项。
【讨论】:
原来是“\\.”如果您正在寻找点字符,则在正则表达式(正则表达式)中有效。 Java String 的非统一 API 给我带来了困难:对于从文件名字符串中定位/提取版本号的任务,我会考虑 String 方法 .endsWith()、.contains(),最后是 .火柴。事实证明,每个都有不同的参数类型,所以事情会变得混乱:.endsWith(String)、.contains(CharSequence) 和 .matches(regex)!【参考方案6】: 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
【讨论】:
正则表达式将确保输入字符串以“work”结尾,后跟一个字符,最后一个字符应该是三个允许的字符之一(逗号、句点或正斜杠) )。以上是关于检查字符串是不是以某种模式结束的主要内容,如果未能解决你的问题,请参考以下文章
如何检查字符串是不是匹配某种日期格式?? JAVA [重复]
如何在Javascript中检查字符串结束位置是不是存在值? [复制]