如何使用负前瞻来匹配较大字符串的一部分?
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)$
^^^^^^^^^^^^^^^^^^^^^^^^
假设我有一个由多个 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)$
^^^^^^^^^^^^^^^^^^^^^^^^