我有一种奇怪的问题,我试图用一些优雅的正则表达式来解决。
我正在研究的系统最初设计为接受传入的字符串,并通过模式匹配方法更改它然后返回的字符串。一个非常简单的例子是:
传入字符串:
The dog & I went to the park and had a great time...
传出字符串:
The dog {&} I went to the park and had a great time {...}
标点符号映射器包装关键字符或短语,并将它们包装在花括号中。最初的实现是单向的,并不意味着它当前的应用方式,因此,如果它被错误地调用,系统很容易“双重”包装一个字符串,因为它只是在做一个简单的字符串替换。
今天早上我启动了 Regex Hero 并开始研究一些模式匹配,并且将近一年没有写过正则表达式,很快就碰壁了。
我的第一个想法是匹配一个字符(即&
),但前提是它没有用大括号括起来并提出[^\{]&[^\}]
,这很好,但当然可以捕获&符号的任何实例,只要它前面没有花括号,包括空格,并且在有两个与号背靠背的情况下不起作用(即&&
需要{&}{&}
在传出字符串中。为了使事情更复杂,它并不总是单个字符,因为省略号 ( ...
) 也是其中之一映射的值。
我浏览的每个解决方案要么遇到障碍,因为字符串中特定值的出现次数未知,或者捕获组要么过于贪婪,要么最终无法背靠背补偿多个值(即单个周期.
vs ellipsis ...
),原始开发人员首先通过处理省略号来处理,该省略号涵盖了字符串替换实现中的期间。
是否有任何正则表达式专家对我如何检测字符串中未修饰(未包装)的值,然后以一种也可以处理多个重复字符的不贪婪方式执行它们的替换有任何想法?
我正在处理的数据源是一个简单的键值对,其中包含要搜索的值和要替换它的值。
使用示例字符串更新:
未装饰:
Show Details...
Default Server:
"Smart" 2-Way
Show Lender's Information
Black & White
装饰:
Show Details{...}
Default Server{:}
{"}Smart{"} 2-Way
Show Lender{'}s Information
Black {&} White
更新了更多具体示例和数据源
数据源(SQL表,可以随时增长):
标记值未标记值
{:}:
- {&} &
- {<} <
- {$} $
- {'}'
- {} \
- {>} >
- {"}"
- {%} %
- {...} ...
- {...} ...</li>
- {:}:</li>
- {"}"</li>
- {“}”</li>
- {'} `
- {'}'</li>
断弦: This is a string that already has stuff {&} other stuff{!} and {...} with {_} and {@} as well{.} and here are the same characters without it & follow by ! and ... _ & . &&&
需要装饰的字符串: Show Details... Default Server: "Smart" 2-Way Show Lender's Information Black & White
将通过方法不变的字符串(因为它已经被装饰): The dog {&} I went to the park and had a great time {...}
转向正则表达式的另一个“陷阱”是需要处理转义,尤其是优雅的反斜杠,因为它们在正则表达式中的功能。
使用@Ethan Brown 的输出更新
@伊桑布朗,
我开始认为正则表达式,虽然优雅可能不是这里的方式。您提供的更新代码虽然更接近,但仍不能产生正确的结果,并且所涉及的变量数量可能超出正则表达式逻辑的能力。
使用我上面的例子:
'This is a string that already has stuff {&} other stuff{!} and {...} with {_} and {@} as well{.} and here are the same characters without it & follow by ! and ... _ & . &&&'
产量
This is a string that already has stuff {&} other stuff{!} and {...} with {_} and {@} as well{.} and here are the same characters without it {&} follow by {!} and {...} {_} {&} . {&&}&
最后一组应该以 {&}{&}{&} 形式出现的 & 符号实际上以 {&&}& 形式出现。
这里有很多可变性(即需要处理来自远东语言的省略号和宽省略号),并且需要使用数据库作为数据源是最重要的。
我想我只是要编写一个自定义评估器,我可以很容易地编写它来执行这种类型的验证并暂时搁置正则表达式路线。一旦我进入桌面浏览器,我就会为您的回答和工作给予肯定。