在下面让我们说邮政编码,我试图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) 开发移动(以色列)电话号码正则表达式.目前我有
re.compile(r'^[\(]?0?(5[023456789])\)?(\-)?\d{7}$')
Run Code Online (Sandbox Code Playgroud)
它捕获了大多数用例.只有出现第一个括号时,问题才在于匹配第二个括号.
所以(055)-5555555或(055)5555555或0555555555匹配但是:055)-5555555不会.我知道我可以使用2个正则表达式来测试条件(如果第一个匹配测试另一个条件),但这似乎不是一个聪明的解决方案.
我想我需要像正则表达式的外观,但不知道如何使用它,或者我正确理解这个概念
编辑:解释逻辑
区号:应以5开头,然后是单个数字(来自特定列表),之前选项为零.也可能在括号内.然后是一个可选的连字符和7位数字
澄清:我需要匹配两个括号只有当另一个存在时,对于第一个也是如此,不仅对于第二个,也错过了这一点
假设我们想要匹配此文本中的所有(选项: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对这个问题的有用解释:正则表达式 - 前瞻断言)
我想包含从 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) 我想编写一个识别以下模式的java Regular表达式.
abc def the ghi和abc def ghi
我试过这个:
abc def (the)? ghi
Run Code Online (Sandbox Code Playgroud)
但是,它没有认识到第二种模式.我哪里出错了?
我正在尝试实现一个正则表达式,其中包含所有具有任意数量单词但不能后跟 : 的字符串,如果匹配则忽略匹配项。我决定对它进行负面展望。
/([a-zA-Z]+)(?!:)/gm
string: lame:joker
Run Code Online (Sandbox Code Playgroud)
因为我使用的是一个字符范围,它一次匹配一个字符,并且只忽略 : 之前的最后一个字符。在这种情况下,我如何忽略整个比赛?
regex101 链接:https ://regex101.com/r/DlEmC9/1
我正在调用一个我无法更改的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,包括一行.到目前为止我还没有成功.我试过的一些东西不起作用:
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)
这解决了右侧,需要左侧的帮助。
我想我对正则表达式中的正向 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 - 所以我得到:

但是测量单位必须保持“可选”,因为它不需要在字符串中(参见第四个实例)......
关于如何处理这个问题的任何想法?谢谢!
正如标题所说,我的目标是发现,当且仅当它包含的子串词相匹配的正则表达式究竟这是不是由相同的字符包围两个连续的字符。
Helo --> falseprogramming --> truebelllike--> 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 风格的解决方案来解决所描述的问题。