我喜欢帝国而且我修改了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”和另一个“)”开头。
答案 0 :(得分:0)
与您的目标匹配的正则表达式是:
(?ms)\(defrule.*?^\s*\)
查看live demo。
使用java从输入中删除这些目标:
str = str.replaceAll("(?ms)\\(defrule.*?^\\s*\\)", "");
正则表达式的要点:
m
是多行标志,它允许^和$匹配输入中行的开头和结尾s
标志是 dotall 标志,它允许点匹配换行符.*?
是一个不情愿的量词,它不会跳过一个部分的末尾以匹配后续部分的结尾