0

我正在尝试在 java 中编写一个与以下行匹配的正则表达式模式。

( country name)( tab or space)( visa type)( tab or space)( valid date in any format)

例如:

United states H1-B 01/01/2020<br/>
Australia L1 2020/01/01

我尝试过使用如下模式。

"(.*)(\\t)(.*)(\\t)(.*)(\\t)(\\z)"
"(\\w*)(\\t)(.*)(\\t)(.*)(\\t)"

但它们都与我的字符串不匹配。怎么做?请帮忙。

4

3 回答 3

1

你可以试试正则表达式:

([A-Za-z]+( \b[A-Za-z]+)*)([\t ]+)(.*)([\t ]+)(.*)

例如:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("([A-Za-z]+( \\b[A-Za-z]+)*)([\\t ]+)(.*)([\\t ]+)(.*)");

public static void main(String[] args) {
    String input = "United states H1-B 01/01/2020\nAustralia L1 2020/01/01";
    System.out.println(
        REGEX_PATTERN.matcher(input).replaceAll(
                      "Country: $1, VisaType: $4, Date: $6")
    );
}

输出:

Country: United states, VisaType: H1-B, Date: 01/01/2020
Country: Australia, VisaType: L1, Date: 2020/01/01
于 2013-09-23T13:35:05.980 回答
0

为什么不像这样围绕制表符或空格进行拆分:

String input = "United states H1-B 01/01/2020";
String []tokens = input.split("\\s");

然后,您可以通过索引访问数组中的每个单独元素。

由于您知道最后两个标记将是日期和签证类型,因此您可以确保数组的其余部分代表国家名称。

注意:当然这是假设签证类型和日期值不能包含任何类型的空格。

于 2013-09-23T13:25:52.010 回答
0

假设签证类型不能包含空格,您可以尝试:

"(.*)\\s+([^\\s]+)\s+(\\d+/\\d+/\\d+)"

根据您想要支持的日期格式,您可能需要相应地更改最后一个匹配组。

于 2013-09-23T13:30:57.047 回答