Java 检查字符串是否以特定模式结束

Java 检查字符串是否以特定模式结束,java,regex,string,pattern-matching,Java,Regex,String,Pattern Matching,如果我有一个字符串,比如: This.is.a.great.place.too.work. 或: 比我的程序应该给我的句子是有效的,它有“工作” 如果我有: This.is.a.great.place.too.work.hahahha 或: 那么我的程序不应该给我在句子中有一个“工作” 因此,我正在查看java字符串,以便在句子末尾找到一个单词,前面有或,或/。我怎样才能做到这一点 这非常简单,对象有一个方法 从您的问题来看,您似乎希望将/、、或作为分隔符集 因此: 您还可以使用该方法和

如果我有一个字符串,比如:

This.is.a.great.place.too.work.
或:

比我的程序应该给我的句子是有效的,它有“工作”


如果我有:

This.is.a.great.place.too.work.hahahha
或:

那么我的程序不应该给我在句子中有一个“工作”



因此,我正在查看java字符串,以便在句子末尾找到一个单词,前面有
/
。我怎样才能做到这一点

这非常简单,对象有一个方法

从您的问题来看,您似乎希望将
/
作为分隔符集

因此:

您还可以使用该方法和一个相当简单的正则表达式:

if (str.matches(".*([.,/])work\\1$"))

使用字符类
[,/]
指定句点、斜杠或逗号以及反向引用,
\1
匹配找到的任何替代项(如果有的话)。

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

您可以测试字符串是否以work结尾,后跟一个字符,如下所示:

theString.matches(".*work.$");
theString.matches(".*work[,./]?$");
如果尾随字符是可选的,可以使用:

theString.matches(".*work.?$");
theString.matches(".*work[./]$");
theString.matches(".*work[./]?$");
要确保最后一个字符是句点
或斜杠
/
,可以使用以下命令:

theString.matches(".*work.?$");
theString.matches(".*work[./]$");
theString.matches(".*work[./]?$");
要测试紧跟着可选的句点或斜杠的工时,可以使用以下命令:

theString.matches(".*work.?$");
theString.matches(".*work[./]$");
theString.matches(".*work[./]?$");
要测试被句点斜杠包围的工作,可以执行以下操作:

theString.matches(".*[./]work[./]$");
theString.matches(".*([./])work\\1$");
如果工作前后的标记必须相互匹配,则可以执行以下操作:

theString.matches(".*[./]work[./]$");
theString.matches(".*([./])work\\1$");

您的确切需求没有精确定义,但我认为应该是这样的:

theString.matches(".*work.$");
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);
    }

}

可以使用子字符串方法:

   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);

我尝试了这里提到的所有不同的方法来获取以
[0-9][0-9]*
结尾的文件名中
字符的索引,例如
srcfile.1
srcfile.12
等。没有任何效果。最后,以下措施奏效了:
int dotIndex=inputfilename.lastIndexOf(“.”)

奇怪!这是java版本:

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文档页面(上面的一个答案中有一个引号)似乎没有指定如何查找
字符。因为
\.
\.
[.]
对我不起作用,我看不到除了这些选项之外还指定了任何其他选项。

似乎这两个答案都没有像OP指定的那样在结尾处多出一个字符。谢谢pb2q,它回答了我的问题,因为我不知道结尾字符是什么(我的问题是最后只有字符(,/$)或者可能没有,但不会有单词。所以在java中,你能解释一下1$@TheLearner是什么吗?正则表达式末尾有两个独立的东西:第一个是
\1
,它是一个反向引用,指的是字符集[,./]中匹配的任何字符。)在前面的正则表达式中,我们用paren将该集合分组为可引用:
([,./])
。而
$
只是表示行尾。下面有一些很好的答案,@Learner;您应该选择一个并将其标记为答案。在正则表达式中显示“\\”如果你正在寻找点字符,那么我就从java字符串的非均匀API中产生了困难:对于从文件名字符串中定位/提取版本号的任务,我将考虑String方法。,最后是.matches。结果表明,每种类型都采用不同的参数类型,因此可能会产生混淆:.endsWith(String)、.contains(CharSequence)和.matches(regex)!这非常有帮助,感谢您提供的信息性响应。提供一些代码解释正则表达式将确保输入字符串以“work”结尾后跟一个字符,最后一个字符应该是允许的三个字符之一(逗号、句点或正斜杠)。
    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