匹配 JAVA 中的字符串

match string in JAVA

我有一个字符串写成 ...YYK0*.

<.>(点)- 字符出现一次(点可以替换为任何字符)

<*>(星号)- 匹配任意字符串

现在我想检查像 TTIYYK0AA 这样的输入字符串是否除了字母 Y 之外还包含字符串 YYK0 必须从输入字符串中的索引 3 开始显示。

也就是说,如果输入的字符串是TTIIYYK0AA或者TTYYK0AA,即使是returnfalse包括字符串 YYK0.

另外index不一定都是3,要看dot的个数。 如果字符串是 .....YYK0* ,这意味着子字符串 YYK0 开始显示在输入中的索引 5 中字符串.

我怎么才能实现那个功能。

请大家帮忙,谢谢大家!

更新:原始答案(包含在末尾)是基于对问题的误解,其他人似乎也做出了误解。

来自 :

It depends on the number of <.> (dot). If the string is .....YYK0* in the database, it means that the string YYK0 must begin to show in the index of 5 in the input string......

因此,您正在从数据库中读取要匹配的模式,并且您希望将该模式转换为可用于测试 Java.

中的字符串的函数

从您的文本来看,. 似乎可以匹配任何 单个 字符,而 * 可以匹配任何字符序列。

在那种情况下,将模式从数据库转换为正则表达式可能是最好的方法。

. 模式与正则表达式相同,即 ..
* 模式在正则表达式中为 .*
其他所有内容都需要转义(引用),因此它会按字面意思进行匹配。

您可以使用此方法将该模式转换为 Java 正则表达式:

private static Pattern toRegex(String patternFromDb) {
    StringBuffer regex = new StringBuffer();
    Matcher m = Pattern.compile("\.{1,}|\*{1,}|[^.*]+").matcher(patternFromDb);
    while (m.find()) {
        String s = m.group();
        switch (s.charAt(0)) {
            case '.':
                // leave dots as they are
                break;
            case '*':
                m.appendReplacement(regex, ".*"); // replace * with .*
                break;
            default:
                m.appendReplacement(regex, Matcher.quoteReplacement(s)); // escape literal match
        }
    }
    return Pattern.compile(m.appendTail(regex).toString());
}

然后您可以像这样使用返回的 Pattern 对象:

Pattern p = toRegex("...YYK0*");

if (p.matcher("TTIYYK0AA").matches()) {
    // code here
}

原答案

你说 "position 4",但你的例子显示 "index 3",所以看起来你的 "position" 是基于 1 的。

在 Java 中,您可以使用以下方式进行测试:

if (str.indexOf("YYK0") == 3)

在 SQL 中,您可以使用以下方式进行测试:

WHERE col LIKE '___YYK0%'
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld{

     public static void main( String args[] ) {
      // String to find the pattern.
      String line = "TTIYYK0AA";
      String pattern = "^.{3}YYK0";

      // Creating a Pattern object
      Pattern r = Pattern.compile(pattern);

      // Creating Matcher object
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("MATCHED");
      }else {
         System.out.println("NO MATCH");
      }
   }
}

在Java中我们可以简单地使用string.indexof()方法得到你的要求, 请找到以下有用的代码。

public class PatternMatch 
{
    public static void main(String[] args) 
    {
        String str = "TTIYYK0AA";
       if(str.indexOf("YYK0") == 3)
        {
            System.out.println("Success");
            //write what ever your want..
        }
        else
        {
            System.out.println("Fail");
            //write what ever your want
        }
    }
}

谢谢。

幸运的是,您的模式字符串类似于正则表达式。

因此您可以将您的模式稍微转换为正则表达式模式,并且只需在 Java.

中使用字符串正则表达式匹配

您需要的转换是将 * 更改为 .*(因为您希望 * 表示任何字符串)

所以函数看起来像(伪代码):

boolean match(String string, String pattern) {
    String regexPattern = pattern.replace("\*", ".*");
    return string.matches(regexPattern);
}