【问题标题】: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;您应该选择一个并将其标记为答案。

标签: java regex string pattern-matching


【解决方案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”结尾,后跟一个字符,最后一个字符应该是三个允许的字符之一(逗号、句点或正斜杠) )。
      猜你喜欢
      • 2013-02-05
      • 2016-06-07
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多