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

Java regex parsing out middle value of String

我有一些以字符串形式出现的数据,我需要提取或打印出格式为 monthvalue(中间组):

[itemvalue][monthvalue][yearvalue]

规则是:

itemvalue = 长度可以是 1-3 个字符(或数字)

月值 = 是单个字母字符 [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})");

然后在 find() 组的输入上调用 matcher,在这种情况下,monthvalue ,应该是 matcher.group(2),比如:

Matcher m = pattern.matcher("OneOfTheExampleInputStringsFromAbove"); 

    if (matcher.find()) {
    System.out.println(matcher.group(2));
}

我以为我很接近,但有一个问题是如何包括长度 1、2 和 4,但排除 yearvalue 的 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
Pattern pattern = Pattern.compile("^([a-zA-Z0-9]{1,3})([a-zA-Z])(([0-9]{1,2})|([0-9]{4}))$");

您应该使用 $ 来限制结束匹配点,否则您限制字符串末尾数字的条件不起作用。

试试这个:

([\w]{1,3})(\D)([\d]{1,4})

示例:

https://www.freeformatter.com/java-regex-tester.html#ad-output

Input     Match:
-----     -----
AP18      (A)(P)(18)
QZAB19    (QZA)(B)(19)
ARM8      (AR)(M)(8)
QZAB123   (QZA)(B)(123)
QZAB1234  (QZA)(B)(1234)
A123      No match
1234      No match

您的正则表达式是正确的。要添加您的最后一个要求,您可以尝试:

^\w{1,3}([a-zA-Z])(?:\d{1,2}|\d{4})$
                   ^^^^^^^^^^^^^^^^
                    This part

上面正则表达式的解释:

^, $ - Represents start and end of line respectively.

\w{1,3} - Matches from [0-9A-Za-z_] 1 to 3 times. If there is a chance that your test string contains _; then try to use [0-9A-Za-z] here.

([a-zA-Z]) - Represents capturing group matching a letter.

(?:\d{1,2}|\d{4}) - Represents a non-capturing group matching the digits 1, 2 or 4 times but not three.

您可以在 here.

中找到上述正则表达式演示

在java中的实施:

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.
    }
}

您可以在here.

中找到上述代码的示例运行