gpt4 book ai didi

regex - 如何处理字符串中的自定义标签并记录格式化信息

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:13:04 29 4
gpt4 key购买 nike

我得到了以下格式的字符串:

Lorem ipsum dolor <a>Hello <b>Nested</b> World</a> sit amet, consectetur

然后我使用正则表达式解析标签并获得所有匹配项的数组,在本例中:

val text = "..."
val listOfRegexes = List[Regex](...)
val allMatches = listOfRegexes
.flatmap(
r => r
.findAllMatchIn(text)
.toList
.map(m => (m.start, m.end, "..."))
)

println(allMatches) // [(18, 49, "a"), (27, 39, "b")]

最终目标是从字符串中删除标签:

Lorem ipsum dolor Hello Nested World sit amet, consectetur

并创建描述格式的元组/对象列表,在本例中它应该如下所示:

[(18, 35, "a"), (24, 29, "b")]

注意索引已经移动,因为标签已被删除

我应该如何编写这个算法?

最佳答案

所以这是一种解决方法。

我们将从定位原始文本中的所有标签开始。

val text =
"Lorem ipsum dolor <a>Hello <b>Nested</b> World</a> sit amet, consectetur"

val tags = "<([^>]+)>".r.findAllMatchIn(text)
.map(m => (m.start,m.end-m.start,m.group(1)))
.toList
//tags: List[(Int, Int, String)] = List((18,3,a), (27,3,b), (36,4,/b), (46,4,/a))

现在我们有了所有标签位置和长度,按顺序,我们可以清理文本。

val cleanTxt = tags.foldLeft((text,0)){
case ((str,acc),(x,len,_)) => (str.patch(x-acc,"",len),acc+len)
}._1
//cleanTxt: String = Lorem ipsum dolor Hello Nested World sit amet, consectetur

配对标签开始/结束位置有点棘手,根据它们在干净文本字符串中的各自位置进行调整。

val cleanTags = tags.foldLeft((List.empty[(Int,String)],0)){
case ((lst,acc),(x,l,n))=> ((x-acc,n)::lst,acc+l)
}._1.reverse
//cleanTags: List[(Int, String)] = List((18,a), (24,b), (30,/b), (36,/a))

def pairTags(ts :Vector[(Int,String)]
,acc :List[(Int,Int,String)] = List()
) :List[(Int,Int,String)] =
if (ts.isEmpty) acc.reverse
else {
val hd = ts.head
val matchX = ts.lastIndexWhere(_._2 == "/" + hd._2)
assert(matchX > 0, "bad tag collection")
pairTags(ts.tail.patch(matchX-1,Vector(),1)
,(hd._1,ts(matchX)._1,hd._2) :: acc)
}

pairTags(cleanTags.toVector)
//res0: List[(Int, Int, String)] = List((18,36,a), (24,30,b))

请注意,这些是每个文本范围的“从”(包括)和“直到”(不包括)索引位置。

关于regex - 如何处理字符串中的自定义标签并记录格式化信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55790903/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com