用于匹配所有内容直到找到单词的正则表达式
regular expression for matching everything until a word is found
我有一段文字重复了好几次。这里有该文本的示例:
我们的想法是拥有一个包含三组的正则表达式,并针对与文本的任何匹配项重复此操作。这里有一个可能的匹配示例:
group1 = HORIZON-CL5-2021-D1-01
group2 (Opening) = 15 Apr 2021
group3 (Deadlines(s)) = 07 Sep 2021
group1 = HORIZON-CL5-2022-D1-01-two-stage
group2 (Opening) = 04 Nov 2021
group3 (Deadlines(s)) = 15 Feb 2022 (First Stage), 07 Sep 2022 (Second Stage)
我正在尝试使用这个正则表达式:
\n(HORIZON-\S+-[A-Z]{1}\d{1}-\d{2}).*?^Opening
差不多可以了。我需要的是在正则表达式中再说两件事:
- 在某些情况下,HORIZON...的最后一个数字之后可能会出现一些文本,例如第二种情况:
HORIZON-CL5-2022-D1-01 -two-stage
- 我需要说 catch everything 直到单词 'Opening:' 出现在一行的开头。我以为是用表达式
.*?^Opening
的这一部分做的,但它似乎不正确。
我该如何解决这个问题?
你可以有这样的东西:HORIZON-\S+-[A-Z]{1}\d{1}-\d{2}(-[^\s]*)?
。我添加了 (-[^\s]*)?
部分。在这里,我告诉正则表达式匹配以 -
开头的内容,直到找到白色 space (\s
)。 ?
使这部分成为可选的,因此它可以显示一次或根本不显示。
在你的模式中,你在第一组中重复了 HORIZON-... HORIZON-()-A1-11HORIZON-+-B2-33
虽然这不应该出现在您的输入中,但应该不是问题。
您的模式中需要开头,我会用正向预测替换它 (Opening|$)
,其中 $
表示行尾。
您似乎没有对正在检索的字符串部分做任何事情,从您的示例中我认为您可以简单地匹配非空格。
const pattern = /\n(HORIZON-\S+)\s*(.*?)\s*(?=Opening|$)/
如果您想要保留原始模式并将其余文本捕获到一个单独的组中,那就是 /\n(HORIZON-\S+-[A-Z]{1}\d{1}-\d{2})(\S*)\s*(.*?)\s*(?=Opening|$)/
。
'\n'开头的表达式与第一行不匹配,可以改成/^(HORIZON-\S+-[A-Z]{1}\d{1}-\d{2})(\S*)\s*(.*?)\s*(?=Opening|$)/
.
要获得第 1 组中的 -two-stage
,您可以将匹配的 0+ 个非空白字符 \S*
添加到现有组中。
您不需要 s
修饰符来使点匹配换行符。相反,您可以使用否定先行匹配所有不以 Opening 开头的行,然后匹配 Opening 并捕获日期和截止日期部分在捕获组中。
注意可以省略{1}
^(HORIZON-\S+-[A-Z]\d-\d{2}\S*)(?:\r?\n(?!Opening\b).*)*\r?\nOpening: (.+)\r?\nDeadline\(s\): (.+)
您可以根据需要让小组以日期之类的部分开始,因为 .+
是广泛匹配。
例如
^(HORIZON-\S+-[A-Z]\d-\d{2}\S*)(?:\r?\n(?!Opening\b).*)*\r?\nOpening: (\d{2} [A-Z][a-z]{2} \d{4})\r?\nDeadline\(s\): (\d{2} [A-Z][a-z]{2} \d{4}.*)
我有一段文字重复了好几次。这里有该文本的示例:
我们的想法是拥有一个包含三组的正则表达式,并针对与文本的任何匹配项重复此操作。这里有一个可能的匹配示例:
group1 = HORIZON-CL5-2021-D1-01 group2 (Opening) = 15 Apr 2021 group3 (Deadlines(s)) = 07 Sep 2021 group1 = HORIZON-CL5-2022-D1-01-two-stage group2 (Opening) = 04 Nov 2021 group3 (Deadlines(s)) = 15 Feb 2022 (First Stage), 07 Sep 2022 (Second Stage)
我正在尝试使用这个正则表达式:
\n(HORIZON-\S+-[A-Z]{1}\d{1}-\d{2}).*?^Opening
差不多可以了。我需要的是在正则表达式中再说两件事:
- 在某些情况下,HORIZON...的最后一个数字之后可能会出现一些文本,例如第二种情况:
HORIZON-CL5-2022-D1-01 -two-stage
- 我需要说 catch everything 直到单词 'Opening:' 出现在一行的开头。我以为是用表达式
.*?^Opening
的这一部分做的,但它似乎不正确。
我该如何解决这个问题?
你可以有这样的东西:HORIZON-\S+-[A-Z]{1}\d{1}-\d{2}(-[^\s]*)?
。我添加了 (-[^\s]*)?
部分。在这里,我告诉正则表达式匹配以 -
开头的内容,直到找到白色 space (\s
)。 ?
使这部分成为可选的,因此它可以显示一次或根本不显示。
在你的模式中,你在第一组中重复了 HORIZON-...
HORIZON-()-A1-11HORIZON-+-B2-33
虽然这不应该出现在您的输入中,但应该不是问题。您的模式中需要开头,我会用正向预测替换它
(Opening|$)
,其中$
表示行尾。您似乎没有对正在检索的字符串部分做任何事情,从您的示例中我认为您可以简单地匹配非空格。
const pattern = /\n(HORIZON-\S+)\s*(.*?)\s*(?=Opening|$)/
如果您想要保留原始模式并将其余文本捕获到一个单独的组中,那就是
/\n(HORIZON-\S+-[A-Z]{1}\d{1}-\d{2})(\S*)\s*(.*?)\s*(?=Opening|$)/
。'\n'开头的表达式与第一行不匹配,可以改成
/^(HORIZON-\S+-[A-Z]{1}\d{1}-\d{2})(\S*)\s*(.*?)\s*(?=Opening|$)/
.
要获得第 1 组中的 -two-stage
,您可以将匹配的 0+ 个非空白字符 \S*
添加到现有组中。
您不需要 s
修饰符来使点匹配换行符。相反,您可以使用否定先行匹配所有不以 Opening 开头的行,然后匹配 Opening 并捕获日期和截止日期部分在捕获组中。
注意可以省略{1}
^(HORIZON-\S+-[A-Z]\d-\d{2}\S*)(?:\r?\n(?!Opening\b).*)*\r?\nOpening: (.+)\r?\nDeadline\(s\): (.+)
您可以根据需要让小组以日期之类的部分开始,因为 .+
是广泛匹配。
例如
^(HORIZON-\S+-[A-Z]\d-\d{2}\S*)(?:\r?\n(?!Opening\b).*)*\r?\nOpening: (\d{2} [A-Z][a-z]{2} \d{4})\r?\nDeadline\(s\): (\d{2} [A-Z][a-z]{2} \d{4}.*)