Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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_Regex_Matcher - Fatal编程技术网

Java正则表达式解析出字符串的中间值

Java正则表达式解析出字符串的中间值,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

我有一些以字符串形式输入的数据,我需要提取或打印出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 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组合。请考虑“投票”和“接受”他(最优秀的)回复。