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

时间:2012-09-07 02:35:13

标签: java regex string pattern-matching

如果我有一个字符串:

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字符串,以便在其前面的 / 之前找到一个单词。 。我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:77)

这很简单,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匹配找到的替代项中的任何一项(如果有)。

答案 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