60

如果我有一个像这样的字符串:

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字符串以在句子末尾找到一个单词,它有或.之前。我怎样才能做到这一点?,/

4

6 回答 6

94

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

于 2012-09-07T02:40:17.780 回答
53

您可以测试一个字符串是否以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);
    }

}
于 2012-09-07T02:49:05.603 回答
2

当然,您可以使用StringTokenizer该类将字符串与 '.' 分开。或'/',并检查最后一个单词是否为“work”。

于 2012-09-07T02:42:26.667 回答
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);
于 2012-09-07T03:13:00.240 回答
0

我尝试了这里提到的所有不同的方法来获取以.结尾的文件名中的字符索引.[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)

此外,官方 Java 文档页面regex(在上面的答案之一中有一个引用)似乎没有指定如何查找该.字符。因为\.,\\.[.]对我不起作用,除此之外我没有看到任何其他选项。

于 2018-06-11T04:08:11.537 回答
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
于 2020-12-28T02:26:36.620 回答