删除Swift中两个特定分隔符之间的字符,处理嵌套结果

时间:2015-09-27 01:24:30

标签: ios regex swift range

我有一个字符串,我想删除两个特定字符之间的所有内容。例如,给定"hello {there} world"我想删除{}之间的所有内容,包括那些分隔符,以便获取"hello world"。它需要处理该模式有任意数量的嵌套结果的场景。例如,"hello {there {mr} } world and {all} those who inhabit it"应该变为"hello world and those who inhabit it"

似乎它需要找到最内部的结果并向外工作以防止删除不正确的范围。例如,如果它只是找到第一个{而第一个},则会生成hello world and those who inhabit it,这是不正确的。如果要删除第一个{和最后一个}之间的所有内容,则会删除不应删除的内容并生成"hello those who inhabit it"

那怎么能实现呢?

可以使用rangeOfString API来获取第一次出现的字符串,并使用这些范围通过stringByReplacingCharactersInRange删除字符,或者可以使用正则表达式模式。我不确定如何利用这些来获得必要的行为。

1 个答案:

答案 0 :(得分:2)

直接的计数算法应该有效:




    

  • 为结果准备一个空字符串
  • 

  • 将计数器初始化为零
  • 

  • 一次输入一个输入字符串的字符
  • 

  • 当字符是左括号时,递增计数器< / li>&#xA;
  • 当字符是右括号时,递减计数器
  • &#xA;
  • 对于所有其他字符,请检查计数器。如果为零,则将字符复制到输出中;否则,跳过角色
  • &#xA;
&#xA;&#xA;

以下是一个示例实现:

&#xA;&#xA;
 < code> let s =“hello {there {mr}} world和{all}那些居住的人”&#xA; var res =“”&#xA; var count = 0&#xA; for c in s {&# XA;切换c {&#xA; case“{”:count ++;打破;&#XA; case“}”:count--;打破;&#XA;默认:&#XA;如果count == 0 {&#xA; res + = String(c)&#xA; }&#XA;打破;&#XA; }&#xA;}&#xA; println(res)&#xA;  
&#xA;&#xA;

修改此项以确保 count 永远不要低于零,以确保输入中的大括号是平衡的。

&#xA;