文章微调器有2层

时间:2012-03-01 14:19:57

标签: regex

我制作了一篇文章微调器,使用正则表达式来查找此语法中的单词:

{word1|word2}

然后将它们拆分为“|”,但我需要一种方法来支持第2层括号,例如:

{{word1|word2}|{word3|word4}}

我的代码在提供这样一行时所做的是“{{word1 | word2}”和“{word3 | word4}”,这不是预期的。

我想要的是当提供这样一行时,我的代码将其分解为“{word1 | word2} | {word3 | word4}”,以便我可以将其与原始函数一起使用并将其分解为实际词语的

我正在使用c#。

以下是伪代码:

Check string for regex match to "{{word1|word2}|{word3|word4}}" pattern
If found, store each one as "{word1|word2}|{word3|word4}" in MatchCollection (mc1)
Split the word at the "|" but not the one inside the brackets, and select a random one (aka, "{word1|word2}" or "{word3|word4}")
Store the new results aka "{word1|word2}" and "{word3|word4}" in a new MatchCollection (mc2)
Now search the string again, this time looking for "{word1|word2}" only and ignore the double "{{" "}}"
Store these in mc2.
I can not split these up normally

这是我用来搜索“{word1 | word2}”的正则表达式:

Regex regexObj = new Regex(@"\{.*?\}", RegexOptions.Singleline);
MatchCollection m = regexObj.Matches(originalText); //How I store them

希望有人可以提供帮助,谢谢!

编辑:我使用递归方法解决了这个问题。我正在制作一篇文章微调器btw。

3 个答案:

答案 0 :(得分:2)

使用正则表达式无法解析,而是必须使用递归下降解析器。通过替换:

将其映射到JSON
  1. {[
  2. |,
  3. wordX"wordX"(正则表达式\ w +)
  4. 然后输入

    {{word1|word2}|{word3|word4}}
    

    变为有效的JSON

    [["word1","word2"],["word3","word4"]]
    

    并在调用json_decode时直接映射到PHP数组。

    在C#中,JavaScriptSerializer也应该可以这样做。

答案 1 :(得分:1)

我真的不完全确定你要求的是什么,但我会试一试:

如果您希望{word1|word2}|{word3|word4}出现{{word1|word2}|{word3|word4}}而不是{word1|word2}{word3|word4},请使用以下内容:

@"\{(\{[^}]*\}\|\{[^}]*\})\}"

... 匹配 {{word1|word2}|{word3|word4}},但第一个匹配组中有{word1|word2}|{word3|word4}

我不确定这是否有用,或者即使它是在正确的轨道上,但我会尝试每隔一段时间检查一次,以获得更多问题或澄清。

答案 2 :(得分:-1)

s =" {旋转|重写|旋转|内容旋转|重写| SEO内容机器}是{有趣|愉快|娱乐|兴奋|享受}!试试{为你自己|你自己|你自己|为你}和{看看如何|观察如何|观察}它{工作|功能|操作|执行|有效}。" print spin(s)

如果要使用[square | bracket |语法],请在过程函数中使用以下行:

' /; | / X&#39 [(((大于[^ []] +)(R))*?)];,