如何使用负前瞻来匹配较大字符串的一部分?

How can I use negative lookahead to match a subsection of a larger string?

假设我有一个由多个 space 分隔的原始表格数据列表,我想将其拆分为单独的列。某些列可以由其中可能包含 spaces 的字符串表示,并且由于多个 spaces 的存在将是我确定每列数据之间边界的方式,我正在尝试使用否定前瞻仅匹配具有单个 space.

的字符串

例如,数据如下:

  1   123456   This is a test string   ABC-123   0

我试过这样的正则表达式:

^\s+(\d)\s+(\d+)\s+((?!.*  )[A-Za-z ]+)\s+([A-Z]{3}-\d{3})\s+\d$

但是它没有按预期工作。直觉上,我觉得 usage/understanding 的前瞻实际操作方式不正确(一般来说可能是正则表达式),所以我正在努力查明确切的问题并找到解决方案。

我如何才能使这种否定前瞻仅应用于 This is a test string 列并使用捕获组从每列中提取数据?

由于列看起来全部由至少 2 个空格分隔,您可以完全省略前瞻,只是懒惰地重复列允许的字符,直到匹配 \s{2,}(两个或更多空格):

^\s+(\d)\s+(\d+)\s+([A-Za-z ]+?)\s{2,}([A-Z]{3}-\d{3})\s+(\d)$
#    ^^ g1  ^^ g2   ^^^^^^^^^^^ g3     ^^^^^^^^^^^^^^ g4  ^^ g5
#                              ^ lazy repeat group 2's chars

https://regex101.com/r/V1Wqqs/1

如果你想为此使用否定前瞻,它看起来有点混乱,但你必须匹配 character-by-character,并且在每个字符之前,否定前瞻 2 个空格:

^\s+(\d)\s+(\d+)\s+((?:(?!\s{2})[A-Za-z ])+)\s{2,}([A-Z]{3}-\d{3})\s+(\d)$
                    ^^^^^^^^^^^^^^^^^^^^^^^^

https://regex101.com/r/V1Wqqs/2