java正则表达式块,不是单行

时间:2014-02-25 00:23:24

标签: java regex

我喜欢帝国而且我修改了AI.But当我测试时我发现我失去了这样的结局“#end-if”。 AI脚本是这样的:

    (defconst gl-current-age 1)  
    (defconst TSA 2)
......<br/>
    #load-if-not-defined TURKISH-CIV<br/>
        (defrule<br/>
        (goal gl-fixed-eco-balancing NO)<br/>
        (up-compare-goal gl-current-age >= gv-feudal-up)<br/>
        (building-type-count barracks > 0)<br/>
        (or    (players-unit-type-count focus-player knight-line > 6)<br/>
               (players-unit-type-count focus-player boyar > 5))<br/>
        (unit-type-count-total spearman-line < 20)<br/>
        (timer-triggered 3)
        (game-time < 2700)                                          ;these are conditions<br/>
    =><br/>
        (up-modify-goal gl-food-gp-points c:+ 10)<br/>
        (up-modify-goal gl-wood-gp-points c:+ 8)                     ;these are actions<br/>
    )<br/>
    #else<br/>
        (defrule<br/>
        (goal gl-fixed-eco-balancing NO)<br/>
        (up-compare-goal gl-current-age >= gv-feudal-up)<br/>
        (building-type-count stable > 0)<br/>
        (or    (players-unit-type-count focus-player knight-line > 6)<br/>
               (players-unit-type-count focus-player boyar > 5))<br/>
        (unit-type-count-total camel-line < 8)<br/>
        (timer-triggered 3)<br/>
        (game-time < 2700)<br/>
    =><br/>
        (up-modify-goal gl-food-gp-points c:+ 10)<br/>
        (up-modify-goal gl-gold-gp-points c:+ 8)<br/>
    )<br/>
    #end-if                                           ;it is just a trigger<br/>

...

我找到了“#load ...”,它没有结尾,但没有任何意义,因为它是跨模块:这是问题。最后我决定删除“(defrule”`和他的“)”成对也是它的内容并离开主框架,然后我可以比较修改后的原始框架并找出它的位置。

所以正常的表情出现在我的脑海中,但我无法继续。我是编程的新手,我只学习扫描仪,当它只读取一行时,java如何找到字符串(多行)?我也不确定我的表达“(defrule。* =&gt;。*)\ n)”。

非常感谢。

1这是一个包含三十万行的AI脚本,但是我失去了一个结尾,我找不到它,因为有一个函数跨模块(不是我写的)。所以我想用java来找出它。

问题1:当java只读取一行时,java如何找到匹配的块?

问题2:正则表达式“(defrule。* =&gt;。*)\ n)”是否正确? (你看,这些块以“(defrule”和以“)结束”,“\ n”和另一个“)”开头。

1 个答案:

答案 0 :(得分:0)

与您的目标匹配的正则表达式是:

(?ms)\(defrule.*?^\s*\)

查看live demo

使用java从输入中删除这些目标:

str = str.replaceAll("(?ms)\\(defrule.*?^\\s*\\)", "");

正则表达式的要点:

  • m多行标志,它允许^和$匹配输入中行的开头和结尾
  • s标志是 dotall 标志,它允许点匹配换行符
  • 表达式.*?是一个不情愿的量词,它不会跳过一个部分的末尾以匹配后续部分的结尾