我有像
这样的句子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)
任何人都可以建议我使用正则表达式吗??? ..
答案 0 :(得分:1)
使用正则表达式
\d+\s(?:\d{4}\s\S*?\s(\S+)|\S+\s(\S+))
<强> Test regex here 强>
\d+
索引号\d{4}\s\S*?\s(\S+)
\S+\s(\S+)
匹配更新:对于使用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+
而不是空格字符。
使用班级Pattern
和Matcher
对每个句子应用正则表达式,并使用匹配器上的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]+))
这意味着:
(?=
- 积极前瞻:^
- 一行开头,(?:.*\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]+
这是使用没有固定长度的正面观察。它使用相当丑陋的结构,语法如:.{0,99}
(从零到99个字符)等。在大多数正则表达式中,你不能在lookbehinds中使用quantires,但是Java允许使用?
和使用min和最大值({2,6}
)。它不是太优雅,但在这种情况下起作用。