正则表达式与条件提取

时间:2015-09-11 12:59:27

标签: java regex

我有像

这样的句子
1 1994 FORD 5640 2WD Tractor

2 AG-GATOR 1004 4x4 Tree Spade Truck

3 2004 ROSCO RB48 Broom

4 TENNANT 830II Street Sweeper

我需要使用正则表达式提取单词,如

5640
1004
RB48
830II
如果有一年如1994年的第一次发送,我需要获得第四个字(5640)如果没有像第二句这样的年份我需要得到第三个字(1004)

任何人都可以建议我使用正则表达式吗??? ..

4 个答案:

答案 0 :(得分:1)

使用正则表达式

\d+\s(?:\d{4}\s\S*?\s(\S+)|\S+\s(\S+))

<强> Test regex here

  1. \d+索引号
  2. 第一类
  3. \d{4}\s\S*?\s(\S+)
  4. \S+\s(\S+)匹配
  5. 更新:对于使用alphanueric的索引

    (?<=^|\n)\w+\s(?:\d{4}\s\S*?\s(\S+)|\S+\s(\S+))
    

    <强> Test regex here

    使用(?<=^|\n),字符串后面的正面看法应该在开头或换行后

答案 1 :(得分:1)

假设布局有些不变(从您的问题看来),只需将年份设为可选:

^\d+ (?:\d{4} )?\S+ (\S+)

表达式的细分:

  • ^开始输入
  • \d+一个数字序列,后跟空格字符
  • (?:\d{4} )?关于4位数字的可选序列,后跟空格字符
  • \S+一系列非空格后跟空格字符
  • (\S+)一系列非空白作为捕获组 - 这就是你所追求的

如果你想支持两者之间的任何空格,可能任何长度都使用\s+而不是空格字符。

使用班级PatternMatcher对每个句子应用正则表达式,并使用匹配器上的group(1)来提取您要查找的群组的内容。

修改:请注意\d将匹配任何类型的数字。如果您只想允许ascii数字0-9使用[0-9]

根据您希望限制可能的年份数量的数量,您可能还希望扩展该表达式,例如(19|20)[0-9]{2}代替\d{4}

答案 2 :(得分:0)

/\d{4}(?!.*\d{4})/g怎么样?使用否定前瞻跳过字符而不匹配。

编辑:此正则表达式匹配文本中的最后4位数序列。

答案 3 :(得分:0)

您可以尝试:

(?=^(?:.*\d{4}\s)?[-a-zA-Z]+\s([a-zA-Z0-9]+))

DEMO

这意味着:

  • (?= - 积极前瞻:
  • ^ - 一行开头,
  • (?:.*\d{4}\s)? - 四位数和空格
  • [-a-zA-Z]+\s - 一个或多个字母和一个支柱,
  • ([a-zA-Z0-9]+) - 一个或多个字母或数字(所需的值)

此正则表达式匹配通过在前瞻中进行分组,因此它不会匹配任何文本,只是文本中的零长度点,但您可以通过group(1)获取值。 Java中的示例:

public class Test{
    public static void main(String[] args){
        String[] array = {"1994 FORD 5640 2WD Tractor","AG-GATOR 1004 4x4 Tree Spade Truck","2004 ROSCO RB48 Broom",
                "TENNANT 830II Street Sweeper","4A 1998 BROCE RJ350 Broom"};
        Matcher matcher = null;
        for(String element : array) {
            matcher = Pattern.compile("(?=^(?:.*\\d{4}\\s)?[-a-zA-Z]+\\s([a-zA-Z0-9]+))").matcher(element);
            if (matcher.find()) {
                System.out.println(matcher.group(1));
            }
        }
    }
}

另一种方式,但仅限于Java,将直接与:

匹配
(?<=^(?:.{0,99}\d{4}\s)?[-a-zA-Z]{1,99}\s)[a-zA-Z0-9]+

DEMO

这是使用没有固定长度的正面观察。它使用相当丑陋的结构,语法如:.{0,99}(从零到99个字符)等。在大多数正则表达式中,你不能在lookbehinds中使用quantires,但是Java允许使用?和使用min和最大值({2,6})。它不是太优雅,但在这种情况下起作用。