3

很抱歉这个冗长的问题。最好举个例子。

我正在尝试将矩阵匹配为字符串:

  1. [[]]
  2. [[][][]]
  3. [[0][1][2]]
  4. [[,,][,,][,,]]
  5. [[0,1,2][3,4,5]]

虽然正则表达式很少好看,但这是我想出的:

\[(\[-?(\d+(\.\d*)?)*(,-?(\d+(\.\d*)?)*)*\])+\]

它匹配一切。但是,逗号必须始终重复 n 次。如果有 5 个逗号,然后是 4 个逗号,然后是 6 个逗号,则它不是有效矩阵。有我可以使用的标志或变量吗?还是超出了正则表达式的范围?

4

1 回答 1

1

不,正则表达式无法做到这一点。

是一个正式的证据,证明与您的情况非常相似的情况是不可能的。它证明了语言 L = {a n b n : n ≥ 0} 不是“正则语言”,因此无法与正则表达式匹配。这种语言本质a*b*上是两颗星重复相同的次数。您的案例还涉及一个明星重复相同的次数,所以这也是不可能的。

在您的情况下,最好的选择可能是使用正则表达式来匹配矩阵的每个“行”,即:对每个匹配抓取组 1 进行全局搜索\[([^][]*)\],这是行的内容,然后计算逗号的数量并比较所有计数(如果您确实需要数字,请使用您的语言的拆分操作对逗号进行拆分。)

PS:[^][]是除开括号和右括号外的所有字符的字符类。右括号必须是 ^ 之后的第一个字符,这是一种特殊情况。

于 2013-02-23T19:14:11.603 回答