Java正则表达式解析出字符串的中间值
我有一些以字符串形式输入的数据,我需要提取或打印出monthvalue(中间组),格式如下: [itemvalue][monthvalue][yearvalue] 这些规则是: itemvalue=长度可以是1-3个字符(或数字) monthvalue=是单个字母字符[a-z] yearvalue=可以是表示日历年的1、2或4位数字 一些示例输入: 输入1Java正则表达式解析出字符串的中间值,java,regex,matcher,Java,Regex,Matcher,我有一些以字符串形式输入的数据,我需要提取或打印出monthvalue(中间组),格式如下: [itemvalue][monthvalue][yearvalue] 这些规则是: itemvalue=长度可以是1-3个字符(或数字) monthvalue=是单个字母字符[a-z] yearvalue=可以是表示日历年的1、2或4位数字 一些示例输入: 输入1 AP18 输出1 p 输入2 QZAB19 输出2 B 输入3 ARM8 输出3 M 我试图编译一个模式,比如: Pattern patte
AP18
输出1
p
输入2
QZAB19
输出2
B
输入3
ARM8
输出3
M
我试图编译一个模式,比如:
Pattern pattern = Pattern.compile("([a-zA-Z0-9]{1,3})([a-z])([0-9]{1,4})");
Matcher m = pattern.matcher("OneOfTheExampleInputStringsFromAbove");
if (matcher.find()) {
System.out.println(matcher.group(2));
}
然后在输入上调用matcher,以find()组,在本例中,是monthvalue,它应该是matcher.group(2)类似:
Pattern pattern = Pattern.compile("([a-zA-Z0-9]{1,3})([a-z])([0-9]{1,4})");
Matcher m = pattern.matcher("OneOfTheExampleInputStringsFromAbove");
if (matcher.find()) {
System.out.println(matcher.group(2));
}
我想我已经接近了,但有一个问题是如何在年值中包含长度1、2和4,但不包括长度3。我的方法好吗?我的编译模式中是否缺少任何内容
请让我知道 如果您正在寻找与正则表达式解决方案不同的解决方案,那么以下内容可能会有所帮助:
String txt = "QZAB19";
String month = txt.replaceAll("[0-9]", ""); //replaces all integers
System.out.println(month.charAt(month.length()-1)); //get you the last character that is month
输出:
B
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
private static final Pattern pattern = Pattern.compile("^\\w{1,3}([a-zA-Z])(?:\\d{1,2}|\\d{4})$", Pattern.MULTILINE);
public static void main(String[] args) {
final String string = "QZAB19\n"
+ "AP18\n"
+ "ARM8\n"
+ "ARM803"; // This won't match since the year value is 3.
Matcher matcher = pattern.matcher(string);
while(matcher.find())System.out.println(matcher.group(1)); // 1st group matches the month-value.
}
}
您应该使用$来限制结束匹配点,否则您在字符串结尾限制DIGT的条件不起作用。尝试以下方法:
([\w]{1,3})(\D)([\d]{1,4})
示例:
你的正则表达式是正确的。要添加您最后的要求,您可以尝试:
^\w{1,3}([a-zA-Z])(?:\d{1,2}|\d{4})$
^^^^^^^^^^^^^^^^
This part
对上述正则表达式的解释:
B
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
private static final Pattern pattern = Pattern.compile("^\\w{1,3}([a-zA-Z])(?:\\d{1,2}|\\d{4})$", Pattern.MULTILINE);
public static void main(String[] args) {
final String string = "QZAB19\n"
+ "AP18\n"
+ "ARM8\n"
+ "ARM803"; // This won't match since the year value is 3.
Matcher matcher = pattern.matcher(string);
while(matcher.find())System.out.println(matcher.group(1)); // 1st group matches the month-value.
}
}
^,$
-分别表示行的开始和结束
\w{1,3}
-从[0-9A-Za-z!]
匹配1到3次。如果您的测试字符串可能包含\uu
;然后尝试在此处使用[0-9A-Za-z]
([a-zA-Z])
表示捕获与字母匹配的组
(?:\d{1,2}|\d{4})
-表示与数字1、2或4次匹配但不是三次的非捕获组
您可以在中找到上面的正则表达式演示
用java实现:
B
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
private static final Pattern pattern = Pattern.compile("^\\w{1,3}([a-zA-Z])(?:\\d{1,2}|\\d{4})$", Pattern.MULTILINE);
public static void main(String[] args) {
final String string = "QZAB19\n"
+ "AP18\n"
+ "ARM8\n"
+ "ARM803"; // This won't match since the year value is 3.
Matcher matcher = pattern.matcher(string);
while(matcher.find())System.out.println(matcher.group(1)); // 1st group matches the month-value.
}
}
您可以在Q中找到上述代码的示例运行:每个项目代码是否总是包含所有三个部分:itemValue、monthValue和yearValue?问:确定itemValue长度的规则是什么:是一个字符、两个字符还是三个字符?是的,每个输入将有三个部分。没有确定itemvalue长度的规则,它可以是随机的1到3个字符或数字。这就是为什么我认为正则表达式是最好的方法。您可以使用或条件排除长度3。@ennth;如果以下任何答案有帮助;请接受最适合你的并关闭此帖子。这将有助于回答者以及这篇文章的未来读者。啊,好吧,这也是我要说的。你把美元放在最后到底是什么意思?每次我看到人们把$放在末尾,他们也在前面使用^,如果我可以问一下,这和不使用^…$有什么不同?谢谢。是的,您还必须使用“^”来严格开始匹配点。我这样建议是因为我可以看到您正在尝试匹配整个输入字符串,但是如果您只想从一个大字符串或文件中选择匹配的部分,那么您不需要使用^和$。但是yearvalue上的“t\d{1,4}是否会选择长度为3?这违反了yearvalue规则。已更新正则表达式。请选中,但yearvalue上的“t\d{1,4}”是否会拾取长度为3?这违反了yearvalue规则。正则表达式将完成它的工作-它将很好地提取值。如果您还想验证潜在的错误输入。。。然后,我建议在提取值之后,检查Java中所有可能的错误。如果您确实想排除“3”,则演示了如何将“或”与a组合。请考虑“投票”和“接受”他(最优秀的)回复。