检查字符串是不是以某种模式结束

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.1srcfile.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中检查字符串结束位置是不是存在值? [复制]

UART 接收中断检查数据结束

请检查数据库连接字符串设置是不是正确或数据库服务器身份验证模式是不是SQL Server和

检查材料表行是不是仍处于编辑模式