用正则expression式parsingExcel引用?

Excel将返回表单的引用

=Sheet1!R14C1R22C71junk 

(“垃圾”通常不会在那里,但我想确保没有多余的文字。)

我想'拆分'成一个VB数组,在哪里

 a(0)="Sheet1" a(1)="14" a(2)="1" a(3)="22" a(4)="71" a(5)="junk" 

我敢肯定它可以用正则expression式来轻松完成,但我无法得到它的诀窍。 有一个善良的人可以帮助我吗?

谢谢

 =([^!]+)!R(\d+)C(\d+)R(\d+)C(\d+)(.*) 

应该pipe用。

[^!]+匹配一系列非感叹号字符。

\d+匹配一个数字序列。

.*匹配任何东西。

所以,在VB.NET中:

 Dim a As Match a = Regex.Match(SubjectString, "=([^!]+)!R(\d+)C(\d+)R(\d+)C(\d+)(.*)") If a.Success Then ' matched text: a.Value ' backreference n text: a.Groups(n).Value Else ' Match attempt failed End If 

一个简单的String.Split可以工作,只要“垃圾”文本不存在:

 Dim input As String = "=Sheet1!R14C1R22C71" Dim result = input.Split(New Char() { "="c, "!"c, "R"c, "C"c }, StringSplitOptions.RemoveEmptyEntries) For Each item As String In result Console.WriteLine(item) Next 

正则expression式有点棘手,因为你需要通过嵌套部分的组和捕获才能得到正确的顺序。

编辑:这是我的正则expression式的解决scheme。 它接受R和C的多次出现。

 Dim input As String = "=Sheet1!R14C1R22C71junk" Dim pattern As String = "=(?<Sheet>Sheet\d+)!(?:R(?<R>\d+)C(?<C>\d+))+" Dim m As Match = Regex.Match(input, pattern) If m.Success Then Console.WriteLine(m.Groups("Sheet").Value) For i = 0 To m.Groups("R").Captures.Count - 1 Console.WriteLine(m.Groups("R").Captures(i).Value) Console.WriteLine(m.Groups("C").Captures(i).Value) Next End If 

模式解释:

  • “=(?Sheet \ d +)”:匹配一个=符号,后跟“Sheet”和数字。 使用命名组“Sheet”
  • “!(?: R(?\ d +)C(?\ d +))+”:匹配感叹号,后面至less出现一次文本的* R * xx * C * xx部分。 使用“R”和“C”的命名组。
  • “(?:…)+”:该部分与上述部分相匹配但不捕获内部图案(即,R / C部分)。 这是为了避免不必要的捕获,而我们实际上用指定的组捕获它们。

更一般的R1C1风格的正则expression式:

 ^=(?:(?<Sheet>[^!]+)!)?(?:R((?<RAbs>\d+)|(?<RRel>\[-?\d+\]))C((?<CAbs>\d+)|(?<CRel>\[-?\d+\]))){1,2}$ 

和A1风格:

 ^=(?:(?<Sheet>[^!]+)!)?(?:(?<Col1>\$?[az]+)(?<Row1>\$?\d+))(?:\:(?<Col2>\$?[az]+)(?<Row2>\$?\d+))?$ 

它不匹配外部引用,例如= [Book1] Sheet1!A1。