我以为我知道regex...情况是这样的:
N-U0 U0-M1
M1-T9 T9-R10 R10-E19
E19-L100 L100-B
字符串
我有一个String
,它包含由空格分隔的组(我们称之为transitions
)(可能是也可能不是换行符,我对它们一视同仁;也可以是一个或多个字符)。每个组由两个组组成(我们称之为exiting
和entering
),由连字符分隔。其中每个都由单个字符(分别为N
或B
)或特定字符和一位或多位数字组成。
我想运行一个正则表达式匹配,它将为每个transition
给予一个对象,然后,对于每个对象,我想通过命名的捕获组访问transition
的每个部分。
这些是我写的正则表达式:
static RegExp regex = RegExp(
r'(?<exitingN>N)|((?<exitingF>[UMTREL]{1})(?<exitingNumber>[0-9]+))-(?<enteringB>B)|((?<enteringF>[UMTREL]{1})(?<enteringNumber>[0-9]+))\s+',
);
static RegExp exitingRegex = RegExp(
r'(?<exitingN>N)|((?<exitingF>[UMTREL]{1})(?<exitingNumber>[0-9]+))-',
);
static RegExp enteringRegex = RegExp(
r'-(?<enteringB>B)|((?<enteringF>[UMTREL]{1})(?<enteringNumber>[0-9]+))',
);
型
当我跑的时候
final matchList = regex.allMatches(
"N-U0 U0-M1\nM1-T9 T9-R10 R10-E19\nE19-L100 L100-B\n",
);
型
它没有像我期望的那样工作。它匹配第一个N
,然后是第一个U0
,然后是第一个M1
,依此类推,直到第一个L100
和B
。我希望它匹配N-U0
,然后是U0-M1
等等。至少matchList.elementAt(0).namedGroup("exitingN")
等工作,但我想要的exiting
和entering
部分在一起。
我尝试在另一个组中添加正则表达式,我尝试了使用和不使用?:
(使其不捕获),加上一些其他测试,我想,但没有任何效果。
然后我只测试了exitingRegex
,它像预期的那样工作,匹配每一个exiting
。但是enteringRegex
不起作用。它匹配了除N
之外的每个exiting
和每个entering
。
我唯一能让它工作的方法是匹配exitingRegex
,然后,对于entering
,我必须首先使用"N-U0 U0-M1\nM1-T9 T9-R10 R10-E19\nE19-L100 L100-B\n".replaceAll(exitingRegex, "",)
,然后匹配enteringRegex
,但没有前导连字符。通过这种方式,我分别得到了exiting
和entering
,稍后我必须通过索引连接它们。
你在干什么?
先谢了。
2条答案
按热度按时间xa9qqrwz1#
要限制由
|
分隔的分支,请将它们 Package 在一个组中。此组可以是捕获组(()
)或非捕获组((?:)
),具体取决于您的需要。也就是说,你的正则表达式应该看起来像这样:字符串
对于
U0-M1
的输入,此正则表达式匹配并返回以下组:U0-M1
U0
exitingF
:U
exitingNumber
:0
请注意,我删除了那些不必要的
{1}
,因为默认情况下,表达式总是匹配其自身的一个示例。试试on regex101.com。
m528fe3b2#
如果你不反对解析器,那么你可以在10分钟内得到必要的结果。
我的意思是花10分钟写一个解析器。
解析器代码更容易理解和改进。
字符串
输出量:
型
此外,它解析得相当快。
在一台相当旧的计算机上,每秒75,000次迭代。
型
输出量:
型