匹配模式与可选字符串

时间:2016-03-06 22:30:54

标签: java regex

在Java应用程序中,我使用此正则表达式:(\ w +)_ \ d 来匹配此表单的模式:

@Component({
  selector: 'compLogin'
})
@View({
  template: `<div>CompLogin</div><button (click)="onClick()">Click</button>
             <router-outlet></router-outlet>`,
  directives: [RouterOutlet] 
})

然后我使用第一个捕获组值(苹果,橙子)。

但是,我现在有一个新请求也匹配这些字符串:

apples_1
oranges_2

其中'drp'是一个固定的3个字符的字符串,需要捕获与之前相同的值:apples,oranges

例如,如果我使用这个正则表达式:(\ w +)(?:drp)?_ \ d 它将在apples_1上完成工作,但不适用于applesdrp_1。

有没有办法用正则表达式做到这一点?

2 个答案:

答案 0 :(得分:3)

你可以使用非贪婪的量词:

(\w+?)(?:drp)?_\d

这样\w+?会占用字符,直到找到"drp_N""_N"(其中N是数字)。

如果您使用贪婪量词,\w+将获取所有可能的字符(包括下划线和数字,因为它们包含在\w中),然后逐个返回字符,直到(?:drp)?_\d成功。但由于(?:drp)?是可选的,因此正则表达式引擎会在找到_N时停止回溯。

答案 1 :(得分:1)

是的,你可以 - 一种方式是使用负面的后视,以确保drp被强制在组外,如果它存在

(\w+)(?<!drp)(?:drp)?_\d+

请参阅https://regex101.com/r/jJ1rM4/3了解演示