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

块的java正则表达式,而不是单行,java,regex,Java,Regex,我喜欢帝国,我是改良人工智能。但当我测试时,我发现我失去了这样一个结局“如果结束”。 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/&

我喜欢帝国,我是改良人工智能。但当我测试时,我发现我失去了这样一个结局“如果结束”。 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/>
(defconst gl当前年龄1)
(除常数TSA 2)
……
#如果未定义,则加载TURKISH-CIV
(定义规则
(目标gl固定生态平衡编号)
(向上比较目标gl当前年龄>=gv向上)
(建筑类型计数营房>0)
(或(玩家单位类型计数焦点玩家骑士行>6)
(玩家单位类型计数焦点玩家boyar>5))
(单位类型计数总斯皮尔曼线<20)
(定时器触发3) (游戏时间<2700);这些是条件
=>
(向上修改目标gl食品总分c:+10)
(向上修改目标gl wood gp点c:+8);这些是行动
)
#否则
(定义规则
(目标gl固定生态平衡编号)
(向上比较目标gl当前年龄>=gv向上)
(建筑类型计数稳定>0)
(或(玩家单位类型计数焦点玩家骑士行>6)
(玩家单位类型计数焦点玩家boyar>5))
(单位类型计数总骆驼线<8)
(计时器触发3)
(比赛时间<2700)
=>
(向上修改目标gl食品总分c:+10)
(向上修改目标总帐黄金总积分c:+8)
)
#如果结束;它只是一个触发器

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

所以我想到了正则表达式,但我不能继续。我是一个编程新手,我只学习scanner,当java只读取一行时,它怎么能找到字符串(不止一行)?此外,我不确定我的表达式“(defrule.*>.*\n)”

非常感谢

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

问题1:java如何在只读取一行的情况下找到匹配的块


问题2:正则表达式“(defrule.*=>.*\n)”是否正确?(您可以看到,这些块以“(defrule”开头,以“)”、“\n”和另一个“)”结尾。

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

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

要使用java从输入中删除这些目标,请执行以下操作:

str = str.replaceAll("(?ms)\\(defrule.*?^\\s*\\)", "");
正则表达式的要点:

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

请将问题的格式设置得更好。这不是Java。你能展示一下你想从给定的输入中匹配什么吗?@m0skit0是的,它不是Java,只是想用Java来解决它。@Bohemian你看,我想删除的块以“(defrule”开头,以“)”结尾,它引出一个“/n”和“'),所以我用这些符号作为字符来匹配块。