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.
中找到上述代码的示例运行
我有一些以字符串形式出现的数据,我需要提取或打印出格式为 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.
中找到上述代码的示例运行