从正则表达式匹配中排除特定模式

时间:2015-05-05 20:37:00

标签: regex

有点继续我的previous问题:

我遇到了另一种我必须照顾的模式,看起来像这样:

Tue 01/24/12 1/24/2012 2:56:25 PM

在这种情况下,我只希望它与1/24/2012 2:56:25 PM部分匹配。

我之前的表达似乎与01/24/12 1上的上述输入相匹配。

在大多数情况下,通过使用以下表达式,我能够完成这项工作:

(?:\w\w\w (0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d)? (0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d((?: |\s*-\s*)(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)( AM| PM)?)?

这里的问题是我不想在我的比赛中实际包含Tue 01/24/12位;我想确保那部分不匹配。我试图通过将?!修饰符添加到第一个非捕获组来使用负面预测,但它并没有做到我认为的那样。

我已尝试查看类似的问题herehere,但答案没有解释任何内容;他们只是为该特定实例提供了一个工作表达式。

1 个答案:

答案 0 :(得分:1)

无论何时在正则表达式中使用(...),您都要创建捕获组,将这些匹配返回到组中。

在你的情况下,你只需要创建一个包含所需输出的组,记住我改变了你的正则表达式,组$ 4有你想要的输出:

Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeOut);

在regexr.com上测试:

enter image description here

要解决间距匹配问题,您需要在第一个(...)之后包含空格?第二组(...)?小组(我包括为\ s?),留下你:

(?:\w\w\w (0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d)? ((0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d((?: |\s*-\s*)(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)( AM| PM)?))?

最后一组也不能(...)?不管怎样,你都会匹配无限。

如果您不需要捕获它们,还应考虑将所有(...)组更改为(?:...),将所需输出保留为$ 1