标签: regex-lookarounds

Java支持条件前瞻

在下面让我们说邮政编码,我试图33333-从结果中排除.
我做:

String zip = "11111 22222 33333- 44444-4444";
String regex = "\\d{5}(?(?=-)-\\d{4})";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(zip);
while (matcher.find()) { 
   System.out.println(" Found: " + matcher.group());     
}
Run Code Online (Sandbox Code Playgroud)

期望获得:

Found:  11111  
Found:  22222  
Found:  44444-4444
Run Code Online (Sandbox Code Playgroud)

我试图强制执行以下格式:
5位数字后跟一个 - 和4位数字.只需要一个 - (连字符)的5位数字

我得到例外:

Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 7
\d{5}(?(?=-)(-\d{4}))
       ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.group0(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source) …
Run Code Online (Sandbox Code Playgroud)

java regex regex-lookarounds

4
推荐指数
1
解决办法
4694
查看次数

只有在特定字符出现之前才会匹配char(条件正则表达式)

开发移动(以色列)电话号码正则表达式.目前我有

re.compile(r'^[\(]?0?(5[023456789])\)?(\-)?\d{7}$')
Run Code Online (Sandbox Code Playgroud)

它捕获了大多数用例.只有出现第一个括号时,问题才在于匹配第二个括号.

所以(055)-5555555或(055)5555555或0555555555匹配但是:055)-5555555不会.我知道我可以使用2个正则表达式来测试条件(如果第一个匹配测试另一个条件),但这似乎不是一个聪明的解决方案.

我想我需要像正则表达式的外观,但不知道如何使用它,或者我正确理解这个概念

编辑:解释逻辑

区号:应以5开头,然后是单个数字(来自特定列表),之前选项为零.也可能在括号内.然后是一个可选的连字符和7位数字

澄清:我需要匹配两个括号只有当另一个存在时,对于第一个也是如此,不仅对于第二个,也错过了这一点

python regex regex-lookarounds

4
推荐指数
1
解决办法
3934
查看次数

正则表达式 - 嵌套前瞻断言

假设我们想要匹配此文本中的所有(选项:one匹配所有):<out>...</out>

<out>hello!</out>
<nx1>home one</nx1>
<nx2>living</nx2>
<out>one text
text one continues 
and at last here ends one</out>
<m2>dog one</m2>
<out>bye!</out>
Run Code Online (Sandbox Code Playgroud)

假设我们使用这种模式:

one(?=(?:(?!<out>).)*</out>)
Run Code Online (Sandbox Code Playgroud)

如果有人解释正则表达式引擎如何逐步处理该模式以及它在处理的每个阶段中的位置(原文中的位置),我真的很感激;(类似于接受@ Tim Pietzcker对这个问题的有用解释:正则表达式 - 前瞻断言

regex regex-lookarounds

4
推荐指数
1
解决办法
4045
查看次数

正则表达式:匹配模式但排除一种情况

我想包含从 a 到 m 的所有字符串。这可以使用[am]* regex来完成,但我不想要字符串以“ deal_string ”开头的情况。这个的正则表达式是什么?

测试用例:

assets/filename.ext           -> pass
deal_string/filename.ext      -> fail
deal_string.ext               -> fail
deal_string_1.ext             -> fail
deal_draft.txt                -> pass
assets_deal_string.txt        -> pass
bombay.txt                    -> pass
zombie.srt                    -> fail
some_deal_string.txt          -> fail
zobie_special_string.txt      -> fail
Run Code Online (Sandbox Code Playgroud)

regex regex-negation regex-lookarounds

4
推荐指数
1
解决办法
2757
查看次数

如何在正则表达式中编写可选单词?

我想编写一个识别以下模式的java Regular表达式. abc def the ghiabc def ghi

我试过这个:

abc def (the)? ghi
Run Code Online (Sandbox Code Playgroud)

但是,它没有认识到第二种模式.我哪里出错了?

java regex regex-lookarounds

4
推荐指数
2
解决办法
1809
查看次数

负前瞻在带有加号量词的字符范围后不起作用

我正在尝试实现一个正则表达式,其中包含所有具有任意数量单词但不能后跟 : 的字符串,如果匹配则忽略匹配项。我决定对它进行负面展望。

/([a-zA-Z]+)(?!:)/gm
string: lame:joker
Run Code Online (Sandbox Code Playgroud)

因为我使用的是一个字符范围,它一次匹配一个字符,并且只忽略 : 之前的最后一个字符。在这种情况下,我如何忽略整个比赛?

regex101 链接:https ://regex101.com/r/DlEmC9/1

python regex regex-lookarounds

4
推荐指数
2
解决办法
781
查看次数

如何仅在某些行上获得多个Java正则表达式匹配

我正在调用一个我无法更改的API.也就是说,我不能将它作为两个连续的正则表达式或类似的东西.API是这样编写的(当然简化):

void apiMethod(final String regex) {
    final String input = 
        "bad:    thing01, thing02, thing03 \n" +
        "good:   thing04, thing05, thing06 \n" +
        "better: thing07, thing08, thing09 \n" +
        "worse:  thing10, thing11, thing12 \n";

    final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);

    final Matcher matcher = pattern.matcher(input);

    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
}
Run Code Online (Sandbox Code Playgroud)

我调用它是这样的:

apiMethod("(thing[0-9]+)");
Run Code Online (Sandbox Code Playgroud)

我希望看到打印出六行,每行04到09,包括一行.到目前为止我还没有成功.我试过的一些东西不起作用:

  • "(事[0-9] +)" - 这匹配所有12件事,这不是我想要的.
  • "^(?:good | better):( thing [0-9] +)" - 这只匹配第4和第7项.
  • "^(?:( ?: good | better):.*)(thing [0-9] +)" - 这只匹配第6和第9项.
  • "(?:(?:^ good:| ^ better:|,)*)(thing [0-9] +)" …

java regex multiple-matches regex-group regex-lookarounds

4
推荐指数
1
解决办法
97
查看次数

Python 正则表达式删除空格 b/wa 括号和数字

Python,我有一个这样的字符串,输入:

IBNR    13,123   1,234  ( 556 )   ( 2,355 )  934 
Run Code Online (Sandbox Code Playgroud)

所需的输出-:

要么删除空格 b/w 括号和数字

IBNR    13,123   1,234  (556)   (2,355)  934  
Run Code Online (Sandbox Code Playgroud)

或删除括号:

IBNR   13,123   1,234  556  2,355  934  
Run Code Online (Sandbox Code Playgroud)

我试过这个:

re.sub('(?<=\d)+ (?=\\))','',text1)
Run Code Online (Sandbox Code Playgroud)

这解决了右侧,需要左侧的帮助。

python regex regex-group python-3.x regex-lookarounds

4
推荐指数
1
解决办法
71
查看次数

正向后视贪婪

我想我对正则表达式中的正向 Lookbehind 的工作方式有一些误解,这是一个例子:

12,2 g this is fully random
89 g random string 2
0,6 oz random stuff
1 really random stuff
Run Code Online (Sandbox Code Playgroud)

假设我想匹配测量单位之后的所有内容,所以我想要“这是完全随机的”、“随机字符串 2”、“随机内容”和真正的“随机内容”。

为了做到这一点,我尝试了以下模式:

(?<=(\d(,\d)?) (g|oz)?).*
Run Code Online (Sandbox Code Playgroud)

但是作为“?” 表示 0 或 1,在这种情况下,模式似乎将 0 优先于 1 - 所以我得到: 在此处输入图片说明

但是测量单位必须保持“可选”,因为它不需要在字符串中(参见第四个实例)......

关于如何处理这个问题的任何想法?谢谢!

regex regex-greedy regex-lookarounds

4
推荐指数
1
解决办法
141
查看次数

正则表达式连续两次匹配包含一个字符的单词

问题

正如标题所说,我的目标是发现,当且仅当它包含的子串词相匹配的正则表达式究竟这是不是由相同的字符包围两个连续的字符。

测试用例

  • Helo --> false
  • programming --> true
  • belllike--> false(因为有三个l
  • shellless--> true(即使有三个ls,这个输入也应该匹配,因为有两个ss

我以前尝试过的事情

正则表达式[a-zA-Z]*([a-zA-Z])\1[a-zA-Z]*匹配至少有两个连续字符的单词,但belllike仍会匹配,因为连续字符没有上限。

我还尝试使用负前瞻和后视。对于一封信,这可能如下所示:

[a-zA-Z]*(?<!a)aa(?!a)[a-zA-Z]*

这个正则表达式满足了这封信的所有要求,a但我和我问的人都不能将它概括为使用捕获组,因此适用于任何信件(复制粘贴此语句 26 次 - 每个字母一次 - 并将它们与 OR 组合不是我正在寻找的解决方案,即使它可能会奏效)。

我在找什么

当然,所描述问题的解决方案会很棒。如果它不能用正则表达式完成,我会同样高兴地解释为什么这是不可能的。

背景

这项任务是我必须为大学完成的任务的一部分。在一次对话中,教授后来表示他们实际上并不想问这个问题,并且可以接受三个或更多相同字符的字符序列。然而,试图为这个问题寻找解决方案的努力激发了我对正则表达式是否真的可以实现的兴趣,如果可以,如何实现。

要使用的正则表达式风味

即使最初的任务应该在 Java 8+ regex 风格中完成,我会用任何 regex 风格的解决方案来解决所描述的问题。

regex regex-group regex-lookarounds

4
推荐指数
1
解决办法
97
查看次数