如果性能受到关注,则在Java中进行字符串模式匹配的最佳方法

Zug*_*dud 1 java regex string-comparison

问候,

假设您想要测试一个字符串以查看它是否完全匹配,或者,如果它与_匹配,并且_后面附加任意数量的字符

有效的匹配示例:

MyTestString
MyTestString_
MyTestString_1234
Run Code Online (Sandbox Code Playgroud)

如果表现是一个巨大的问题,你会调查哪种方法?目前我正在做以下事情:

if (String.equals(stringToMatch)) {
            // success
        } else {
            if (stringToMatch.contains(stringToMatch + "_")) {
                // success
            }
            // fail
        }
Run Code Online (Sandbox Code Playgroud)

我尝试用_*上的Java.util.regex.Pattern匹配替换String.contains _的模式,但这表现得更糟.我的解决方案在这里是理想的还是你能想到更多切割器来提高性能吗?

谢谢你的任何想法

Pet*_*rey 8

你可以做点什么

if(string.startsWith(testString)) {
    int len = testString.length();
    if(string.length() == len || string.charAt(len) == '_')
          // success
}
Run Code Online (Sandbox Code Playgroud)

我假设你想要testString出现,即使你有一个"_"?


编辑:关于是使用一个长条件还是嵌套if语句,代码或性能没有区别.

public static void nestedIf(boolean a, boolean b) {
    if (a) {
        if (b) {
            System.out.println("a && b");
        }
    }
}

public static void logicalConditionIf(boolean a, boolean b) {
    if (a && b) {
        System.out.println("a && b");
    }
}
Run Code Online (Sandbox Code Playgroud)

编译成相同的代码.如果你这样做javap -c

public static void nestedIf(boolean, boolean);
  Code:
   0:   iload_0
   1:   ifeq    16
   4:   iload_1
   5:   ifeq    16
   8:   getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  ldc     #8; //String a && b
   13:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   16:  return

public static void logicalConditionIf(boolean, boolean);
  Code:
   0:   iload_0
   1:   ifeq    16
   4:   iload_1
   5:   ifeq    16
   8:   getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  ldc     #8; //String a && b
   13:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   16:  return
Run Code Online (Sandbox Code Playgroud)

编译的代码是相同的.