JAVA中的匹配字符串
我有一个写为…YYK0*的字符串 (点)-字符的单次出现(点可以被任何字符替换) (星号)-匹配任何字符串 现在我想检查像TTIYYK0AA这样的输入字符串是否包括字符串YYK0,除了字母Y必须开始显示在输入字符串的索引3中之外 也就是说,如果输入字符串是ttiyk0aa或TTYYK0AA,则即使它包含字符串YYK0,也将返回false 除此之外,索引并不总是等于3,它取决于点的数量。 如果字符串是…YYK0*,则表示子字符串YYK0开始显示在输入字符串的索引5中 我怎样才能实现这个功能 请帮忙,谢谢你们 更新:最初的答案(包括在末尾)是基于对问题的误解,其他人似乎也有误解 发件人: 它取决于(点)的数量。如果数据库中的字符串是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*
,则表示字符串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);
}