如果第二行不以给定单词开头,则正则表达式搜索两个连续行

时间:2013-11-28 12:53:40

标签: regex

我正在尝试(在 Eclipse 中,我不知道语法是否有所不同)来编写一个正则表达式,它将从'service'到接下来的两个';',但如果在两个'之间跳过搜索;',则会出现'断言'这个词。

这意味着在下面的示例中,我想选择文本'service.updateBasket ......... test();'而不是文本 'service.createBasket ......... asserThat .....;'

BasketBean updateBasketRepsonse =
   service.updateBasket(login.getSessionId(),
                        Identity.valueOf(createdbasketBean.getGeneralID()),
                        basketSaveRequestBean);

test();

Response createBasketResponse = service.createBasket(login.getSessionId(),
                                                     basketSaveRequestBean);

assertThat(createBasketResponse).hasStatus(Status.CREATED);

到目前为止,我已经编写了正则表达式service\.(.*\R)*?.*;,它找到了我想要的文字,直到第一个';'。但是我在处理搜索时遇到问题,直到下一个';'

例如service\.(.*\R)*?.*;\R.*;有时会上升到第三个';'(如果第一个'后面有一个空行;')...我不明白为什么。

特别是,如果第一个';'之后的行以'断言'开头,我似乎找不到跳过搜索的方法 - 那将是我的最终目标。

请注意,我搜索的行是CONSECUTIVE,即搜索只需要考虑第一行';'后面跟一行文字的行...如上所述,我也遇到了麻烦:(

2 个答案:

答案 0 :(得分:1)

service(?![^;]*;[^;]*assert[^;]*;)[^;]*;[^;]*;

请参阅 this demo


编辑:

要防止空行成为匹配的一部分,请使用更复​​杂的模式

service(?!(?:[^;\n\r]|[\n\r](?![\n\r]))*;(?:[^;\n\r]|[\n\r](?![\n\r]))*assert(?:[^;\n\r]|[\n\r](?![\n\r]))*;)(?:[^;\n\r]|[\n\r](?![\n\r]))*;(?:[^;\n\r]|[\n\r](?![\n\r]))*;

请参阅 this demo

答案 1 :(得分:0)

  
    

例如service\.(.*\R)*?.*;\R.*;有时会上升到第三个';' (如果在第一个';'之后有一个空行)......我不明白为什么。

  

我认为你只缺少表达结尾的一小部分 尝试

service\.(.*\R)*?.*;\R.*?;

最终?使表达式的最后一部分变为lazy,这意味着它应该只到达第二个;