Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在正则表达式中对重叠模式进行优先级排序?_C#_Regex_Negative Lookahead_Overlapping Matches - Fatal编程技术网

C# 如何在正则表达式中对重叠模式进行优先级排序?

C# 如何在正则表达式中对重叠模式进行优先级排序?,c#,regex,negative-lookahead,overlapping-matches,C#,Regex,Negative Lookahead,Overlapping Matches,我见过几个类似的问题,甚至有一个是我自己发布的,但这是相当具体的 在正则表达式中有一个匹配模式。现在假设在同一个字符串中有两个匹配模式,它们都可以匹配文本。似乎我的运气总是偏向于匹配错误模式的正则表达式。(我在C#中使用.Net正则表达式) 我需要分解两种类型的字符串: 01-第一个值| 02-第二个值|空白-忽略 以及: A-第一个值B-第二个值C-第三个值 所以我想要的结果是用一个模式字符串将代码和含义匹配起来 Code,Meaning 01,First Value 02,Second Va

我见过几个类似的问题,甚至有一个是我自己发布的,但这是相当具体的

在正则表达式中有一个匹配模式。现在假设在同一个字符串中有两个匹配模式,它们都可以匹配文本。似乎我的运气总是偏向于匹配错误模式的正则表达式。(我在C#中使用.Net正则表达式)

我需要分解两种类型的字符串:

01-第一个值| 02-第二个值|空白-忽略

以及:

A-第一个值B-第二个值C-第三个值

所以我想要的结果是用一个模式字符串将代码和含义匹配起来

Code,Meaning
01,First Value
02,Second Value
Blank,Ignore
A,First Value
blank,
B,Second Value
C,Third Value
我尝试过几种模式,但似乎永远都不可能完全正确。我能得到的最接近的结果是:

(([A-Z0-9]{1,4})[ \-–]{1,3}|([Bb]lank)[ \-–]{0,3})(([A-Z][a-z]+[.,;| ]?)+)
我的崩溃:

  • [A-Z0-9]{1,4}[\---]{1,3}
    -->这与代码、大写或小写匹配 长度为1-4个字符,后跟1到3个字符的空格, 连字符,或html中的mdash

  • [Bb]lank[\--]{0,3}
    -->空格后跟0-3个空格、连字符或 来自html的mdash
然后

  • (([A-Z][A-Z]+[,|]?)+)
    -->应匹配任何多个单词,包括 可能的空间。所以第一个和值,第二个和值应该是 匹配
最初的问题是最终的模式组与第二个输入字符串中的“Valueblank”匹配。我想以某种方式将“[Bb]lank”作为第一组的一部分进行匹配,而不是作为第二组的一部分进行匹配。
我试着在最后一组中加入一个
(?![Bb]lank)
消极的前瞻,但似乎从来都不起作用。任何帮助都将不胜感激

谢谢


Jaeden“Sifo Dyas”al'Raec Runer将选择第一个最长的匹配,也就是说,如果两个模式开始在同一位置匹配,并匹配相同数量的字符,则将选择较早的替代方案

例如,以下(愚蠢的示例)将始终优先匹配第一个备选方案而不是第二个备选方案: (.+)| foo

在您的情况下,如果您确实希望匹配两个项目,其中一个以数字开头,另一个以字母开头,为什么不: ([0-9]+…)|([A-Za-z]…)

尽可能早地匹配两个备选方案。

下面的()如何:

解释

[Bb]lank
“空白”的所有匹配项检查小写字母或大写字母是否为“B”

第一个捕获组:将字母数字第一个值或“空白”第一个值与(正向前瞻)后的“-”或“–”匹配或将不具有第二个匹配组的“空白”第一个值匹配

(?:\h[-–]\h|\|)?
(?=[Bb]lank|\||[A-Z0-9]{1,4}\h[-–]\h|$)
分隔符“-”“–”“|”,将出现零次或一次

(.*?)
不精确地匹配第二个匹配组

(?:\h[-–]\h|\|)?
(?=[Bb]lank|\||[A-Z0-9]{1,4}\h[-–]\h|$)

使用正向前瞻,查找一个“空白”“|”字母数字首值,在行尾后加“-”或“--”(捕捉行中的最后一项),以找到我们应该捕捉的结尾处。好吧,这不是数字或字符的问题,它只是能够标记出“acidentblank”中的“blank”不是第2组单词匹配的一部分,而是第1组代码匹配的一部分。现在我被迫做了一个两阶段的过程,用$1 |$2 |$3替换(\w+)(空白)(\w+)来强制分离,但我想知道是否有一种方法可以用一次而不是两次来检测它。什么是\h?我不认识那个正则表达式标记。它是水平空白的简写字符。您也可以通过像
\H
一样将其大写来否定这一点。同样,您也可以使用
\v
\v
对垂直空格执行相同的操作。我通常不是C#regexer,但在您的情况下,您可能会使用
\h
替换
\s
,如果这会给您带来问题,就像我刚才为可能的空格所做的那样\C#matches中的s \r或\n不是。尽管如此,这真是太棒了。我更新了它,添加了一个额外的选项[Ss]步数?它的行为类似于“[Bb]lank”单词匹配。但是这里有一个小的转折:
((?:[a-Z0-9]{1,4}[Bb]lank |[Ss]paces?(=?[--]?)|[Bb]lank |[Ss]paces?
是我的更新,但我发现偶尔在我解析的字符串中,我会得到“Blank/Spaces”作为单数代码,我可以将更新转换到正则表达式中,但是除了另一种替代方法,还有更好的方法来检查吗?i、 e.:[…]
|[Bb]lank |[Ss]paces?|[Bb]lank/[Ss]paces
嗯,可能吧。你能用新的正则表达式更新我的regex101链接,并用更多的例子来演示这些案例吗?