正则表达式 - 忽略多个空格并仅考虑匹配中的一个空格

Sav*_*ngh 5 regex

我偶然发现了一个正则表达式,在尝试了几种不同的方法后无法修复它。

以下是带有示例输入的正则表达式的链接,下面是用于快速参考的正则表达式和示例文本:

正则表达式

    ((XYZ|xyz|Xyz|Convent){1}(\s{0,})(INTERNATIONAL|International|international|INC|Inc|inc|LLC|Llc|llc|WORLDWIDE PTE\. LTD\.){0,})([\r\n]|[\t]|[ ]{2,})(?<CircuitID>[a-zA-Z0-9\-\/\ ]{6,26})\s*
Run Code Online (Sandbox Code Playgroud)

输入示例

Circuits Affected:
Company Name    Circuit ID      Z End   Billing ID      ServiceType
XYZ INTERNATIONAL      A1B101012        ABCD-XYZ-ABG089AB       A000123456      UNI
XYZ INTERNATIONAL   AB/PQRS/012345/ /ABC /  PQRSTUVW    ABCDEFGH    CO ADDRESS CITY 1234 S RIDGELINE BLVD   VA SOMECITY 12345 SOME BRANCH PKWY  A0123456    N/A 0:00 CDT - 1:00 CDT 
________________________________________
XYZ INTERNATIONAL   AB/ABYX/271703/ /ABC /  ABCDO47HBS  ABCDEFG71   N/A N/A A0123456    N/A 0:00 CDT - 1:00 CDT 
________________________________________
XYZ WORLDWIDE PTE. LTD. A1234597    N/A N/A N/A N/A A0123456    abcde-randomashb-12234568   0:00 CDT - 1:00 CDT 
________________________________________
Convent Inc A123 4599   N/A N/A N/A N/A A0123456    abcde-randomhigh-00012345   0:00 CDT - 1:00 CDT 
________________________________________
XYZ INTERNATIONAL   B124565 N/A N/A N/A N/A A0123456    abcde-randomashb-12234568   0:00 CDT - 1:00 CDT 
________________________________________
XYZ INC AB/CDEF/123455/ /ABC /  ABCDEFGH    PQRSTUVW    N/A N/A A0123456    N/A 0:00 CDT - 1:00 CDT 
________________________________________
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是捕获电路 ID 列中的值。如果电路 ID 后面有制表符,则效果很好。但有时Circuit ID后面有多个空格,而不是制表符。这次,它通过捕获下一列中的一些额外字符来捕获错误的电路 ID。

为了解决这种情况,我需要修改捕获组,以便仅当电路 ID 中只有一个空格时才会考虑文本。

在下面的屏幕截图中,它不应捕获红色下划线的数据。绿色下划线的都是可以的:

在此输入图像描述

小智 3

您可以通过编辑 CircuitID 部分来匹配单个空格,以匹配后面没有另一个空格字符的空格字符 (?! )(负向先行)或非空格字符之一[a-zA-Z0-9\-\/]

所以 CircuitID 部分变成(?<CircuitID>(?:[a-zA-Z0-9\-\/]| (?! )){6,26})

正则表达式101