我正在尝试(在 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,即搜索只需要考虑第一行';'后面跟一行文字的行...如上所述,我也遇到了麻烦:(
答案 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,这意味着它应该只到达第二个;