Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA中的匹配字符串_Java_String_Substring_Match_String Comparison - Fatal编程技术网

JAVA中的匹配字符串

JAVA中的匹配字符串,java,string,substring,match,string-comparison,Java,String,Substring,Match,String Comparison,我有一个写为…YYK0*的字符串 (点)-字符的单次出现(点可以被任何字符替换) (星号)-匹配任何字符串 现在我想检查像TTIYYK0AA这样的输入字符串是否包括字符串YYK0,除了字母Y必须开始显示在输入字符串的索引3中之外 也就是说,如果输入字符串是ttiyk0aa或TTYYK0AA,则即使它包含字符串YYK0,也将返回false 除此之外,索引并不总是等于3,它取决于点的数量。 如果字符串是…YYK0*,则表示子字符串YYK0开始显示在输入字符串的索引5中 我怎样才能实现这个功能 请帮忙

我有一个写为…YYK0*的字符串

(点)-字符的单次出现(点可以被任何字符替换)

(星号)-匹配任何字符串

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

也就是说,如果输入字符串是ttiyk0aaTTYYK0AA,则即使它包含字符串YYK0,也将返回false

除此之外,索引并不总是等于3,它取决于点的数量。 如果字符串是…YYK0*,则表示子字符串YYK0开始显示在输入字符串的索引5中

我怎样才能实现这个功能

请帮忙,谢谢你们

更新:最初的答案(包括在末尾)是基于对问题的误解,其他人似乎也有误解

发件人:

它取决于(点)的数量。如果数据库中的字符串是
..YYK0*
,则表示字符串YYK0必须开始显示在输入字符串的索引5中

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

从文本中可以看出,
可以匹配任何单个字符,
*
可以匹配任何字符序列

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

模式与regex相同,即a

*
模式将是regex中的
*

其他所有内容都需要转义(引用),因此它会被逐字匹配

您可以使用此方法将该模式转换为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 p = toRegex("...YYK0*");

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

原始答案

您说的是“位置4”,但您的示例显示的是“索引3”,因此您的“位置”似乎是以1为基础的

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

if(str.indexOf(“YYK0”)==3)
在SQL中,可以使用以下方法进行测试:

其中col类似于“\uuuuuyyk0%”

在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中使用字符串正则表达式匹配即可

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

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


您忘记发布代码了,请至少提供一个示例输出java:
str.indexOf(“YYK0”)==3
--SQL:
类似“\uuuuuuyk0%”的列来检查索引:String s=“ttiyyk0aa”;如果(s.charAt(4)='Y'){//您的代码}清理您的问题,然后。避免无关和误导性的信息,这样人们就可以关注你的问题为什么要把
()
捕获组放在模式中?如果使用
find()
,为什么要以
*
结尾?谢谢@Andreas,我已经编辑了代码。我忘了从最终代码中删除。*,并在练习时发布了代码…:-)对不起,我必须声明它是索引3。还有另一个问题:指数并不总是3,有时是4或其他。它取决于(点)的数量。那么…,我该怎么办呢?谢谢。@xiao您的问题是“字母Y必须开始显示在位置4中”。那是什么呢?它必须在第4位(亦称索引3),或者在第4位之后的某个位置,或者什么?它取决于(点)的数量。如果数据库中的字符串是….YYK0*,则表示输入字符串中的索引5中必须开始显示字符串YYK0……@xiao Wow,您的问题有误导性。没人会这样读你的问题。我知道,我只是出于这个想法哈哈
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
        }
    }
}
boolean match(String string, String pattern) {
    String regexPattern = pattern.replace("\\*", ".*");
    return string.matches(regexPattern);
}