-1

给定以下字符串:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla rhoncus ipsum a eros tincidunt ultricies...

[menu]
item 1|http://stackoverflow.com/1
item 2|http://stackoverflow.com/2
item 3|http://stackoverflow.com/3
[/menu]

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla rhoncus ipsum a eros tincidunt ultricies...

我正在尝试生成一个返回的正则表达式:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla rhoncus ipsum a eros tincidunt ultricies...

<ul>
<a href="http://stackoverflow.com/1">Item 1</a>
<a href="http://stackoverflow.com/2">Item 2</a>
<a href="http://stackoverflow.com/3">Item 3</a>
</ul>

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla rhoncus ipsum a eros tincidunt ultricies...

每个字符串中可能有一个或多个菜单块,并且每个块中的链接数量未知。我能够交换整个块,但在替换块中的各个链接时会摔倒。

有没有一种方法可以在一个或多个正则表达式中执行此操作(如果可能,我宁愿避免将字符串拆分为数组)。我正在使用 vbScript,但一个通用的示例同样有用。

4

3 回答 3

1

一种(有点复杂)的方法:

Option Explicit

Dim g_reItem ' sorry, must be global

Class cReMagic
  Private m_reMenu
  Private Sub Class_Initialize()
    Set m_reMenu = New RegExp
    m_reMenu.Global     = True
    m_reMenu.IgnoreCase = True
    m_reMenu.MultiLine  = True
    m_reMenu.Pattern    = "^\[menu\]([\s\S]+?)^\[/menu\]$"
    Set g_reItem = New RegExp
    g_reItem.Global     = True
    g_reItem.IgnoreCase = True
    g_reItem.MultiLine  = True
' item 1|http://stackoverflow.com/1
' <a href="http://stackoverflow.com/1">Item 1</a>
    g_reItem.Pattern    = "^\s*([^|]+)\|(http:.+?)(\r)$"
  End Sub
  Public Function Replace(sInp)
    Replace = m_reMenu.Replace(sInp, GetRef("MenuRpl"))
  End Function
End Class

Function MenuRpl(sM, sG1, nPos, sSrc)
  MenuRpl = "<ul>" & g_reItem.Replace(sG1, GetRef("ItemRpl")) & "</ul>"
End Function

Function ItemRpl(sM, sG1, sG2, sG3, nPos, sSrc)
  ItemRpl = vbCrLf & "<a href=""" & sG2 & """>" & sG1 & "</a>"
End Function

  Dim sInp : sInp = Join(Array( _
       "Lorem ipsum dolor sit amet, consecte" _
     , "" _
     , "[menu]" _
     , "item 1|http://stackoverflow.com/1" _
     , "item 2|http://stackoverflow.com/2" _
     , "item 3|http://stackoverflow.com/3" _
     , "[/menu]" _
     , "" _
     , "[mune]" _
     , "item 1|http://stackoverflow.com/1" _
     , "item 2|http://stackoverflow.com/2" _
     , "item 3|http://stackoverflow.com/3" _
     , "[/mune]" _
     , "[menu]" _
     , "item 4|http://stackoverflow.com/4" _
     , "[/menu]" _
     , "" _
     , "Lorem ipsum dolor sit amet, consecte" _
  ), vbCrLf)
  WScript.Echo sInp
  WScript.Echo "------------------"

  Dim oReMagic : Set oReMagic = New cReMagic
  WScript.Echo oReMagic.Replace(sInp)
  WScript.Echo "------------------"

输出:

Lorem ipsum dolor sit amet, consecte

[menu]
item 1|http://stackoverflow.com/1
item 2|http://stackoverflow.com/2
item 3|http://stackoverflow.com/3
[/menu]

[mune]
item 1|http://stackoverflow.com/1
item 2|http://stackoverflow.com/2
item 3|http://stackoverflow.com/3
[/mune]
[menu]
item 4|http://stackoverflow.com/4
[/menu]

Lorem ipsum dolor sit amet, consecte
------------------
Lorem ipsum dolor sit amet, consecte

<ul>
<a href="http://stackoverflow.com/1">item 1</a>
<a href="http://stackoverflow.com/2">item 2</a>
<a href="http://stackoverflow.com/3">item 3</a>
</ul>

[mune]
item 1|http://stackoverflow.com/1
item 2|http://stackoverflow.com/2
item 3|http://stackoverflow.com/3
[/mune]
<ul>
<a href="http://stackoverflow.com/4">item 4</a>
</ul>

Lorem ipsum dolor sit amet, consecte
------------------
于 2013-07-25T10:41:36.577 回答
0
[Pseudo]

假设有几件事:

-It is always going to be urls between the menus
-You want the end of each to be item [position]
-Each item starts with item[number]

我给你的建议是一步一步来:

  1. 找到每个menu]并替换为ul]应该足够容易的
  2. 将每个项目放入一个集合中,例如一个数组,您可以通过将以下正则表达式的每个匹配项放入数组中来做到这一点。 item\s?\d.*
  3. 循环遍历数组中的每个项目,并为每个项目替换 with 的匹配项item\s?\d<a href="然后将其连接到字符串的末尾">Item [array position(plus 1 if of zero index)]</a>
于 2013-07-25T09:52:33.010 回答
0

您可以/(.+)\|(.+)/用作您的正则表达式,然后<a href="$2">$1</a>作为您的替代品来获取物品......

然后只需使用普通的字符串替换来更改[menu][/menu]

于 2013-07-25T09:52:36.713 回答