有点继续我的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
位;我想确保那部分不匹配。我试图通过将?!
修饰符添加到第一个非捕获组来使用负面预测,但它并没有做到我认为的那样。
答案 0 :(得分:1)
无论何时在正则表达式中使用(...),您都要创建捕获组,将这些匹配返回到组中。
在你的情况下,你只需要创建一个包含所需输出的组,记住我改变了你的正则表达式,组$ 4有你想要的输出:
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ip, port), timeOut);
在regexr.com上测试:
要解决间距匹配问题,您需要在第一个(...)之后包含空格?第二组(...)?小组(我包括为\ 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