匹配 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);
}
我有一个字符串写成 ...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);
}