有人能以一种可以理解的方式解释这两个术语吗?
我需要有关非贪婪选项的正则表达式匹配的帮助.
匹配模式是:
<img\s.*>
Run Code Online (Sandbox Code Playgroud)
要匹配的文字是:
<html>
<img src="test">
abc
<img
src="a" src='a' a=b>
</html>
Run Code Online (Sandbox Code Playgroud)
此表达式匹配从<img最后到的所有文本>.我需要它与>初始后遇到的第一个匹配<img,所以在这里我需要得到两个匹配而不是我得到的匹配.
我尝试了所有非贪婪的?组合,没有成功.
我想知道是否有更好的代表正则表达式中的重复数量.例如,如果我只想匹配14个字母/数字,我使用^\w\w\w\w\w\w\w\w\w\w\w\w\w\w$哪个会匹配一个单词UNL075BE499135而不匹配UNL075BE499135AAA
是否有方便的方法呢?我现在正在java中这样做,但我想这可能也适用于其他语言.提前致谢.
来自Patternjavadocs:
Greedy quantifiers:
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
Reluctant quantifiers:
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, … 这是一系列教育正则表达式文章的第三部分.它遵循这个正则表达式如何找到三角形数字?(首先介绍嵌套引用)和如何将^ nb ^ n与Java正则表达式匹配? (前瞻性"计数"机制进一步详述).这部分介绍了一种特定形式的嵌套断言,当与嵌套引用结合使用时,Java正则表达式可以匹配大多数人认为"不可能"的东西:回文!
回文的语言是非常规的 ; 它实际上是无上下文的(对于给定的字母表).也就是说,现代正则表达式实现不仅仅识别常规语言,Perl/PCRE的递归模式和.NET的平衡组可以很容易地识别回文(参见:相关问题).
但是,Java的正则表达式引擎既不支持这些"高级"功能.然而"某人" (*wink*)成功编写了以下正则表达式,这似乎做得很好(参见ideone.com):
public class Palindrome {
// asserts that the entirety of the string matches the given pattern
static String assertEntirety(String pattern) {
return "(?<=(?=^pattern$).*)".replace("pattern", pattern);
}
public static void main(String[] args) {
final String PALINDROME =
"(?x) | (?:(.) add)+ chk"
.replace("add", assertEntirety(".*? (\\1 \\2?)"))
.replace("chk", assertEntirety("\\2"));
System.out.println(PALINDROME);
// (?x) | (?:(.) (?<=(?=^.*? (\1 \2?)$).*))+ (?<=(?=^\2$).*)
String[] tests …Run Code Online (Sandbox Code Playgroud) 我主要关心的是Java风格,但我也很欣赏有关其他人的信息.
假设你有一个像这样的子模式:
(.*)(.*)
Run Code Online (Sandbox Code Playgroud)
虽然不是很有用,但是让我们说这两个捕获组(比如说,\1和\2)是一个更大的模式的一部分,它与这些组的反向引用相匹配,等等.
所以两者都是贪婪的,因为他们尽可能地捕捉,只在必要时减少.
我的问题是:谁更贪婪?是否\1优先考虑,\2仅在必要时给予其份额?
关于什么:
(.*)(.*)(.*)
Run Code Online (Sandbox Code Playgroud)
让我们假设\1确实是第一优先.让我们说它过于贪婪,然后吐出一个角色.谁先得到它?它总是\2或可以\3吗?
让我们假设这\2是被\1拒绝的.如果这仍然不起作用,谁现在吐出来?是\2吐\3,还是先\1吐出另一个\2?
如果你写这样的东西会发生什么:
(.*)(.*?)(.*)
Run Code Online (Sandbox Code Playgroud)
现在\2不情愿.这是否意味着\1吐出来\3,\2只是不情愿地接受了\3拒绝?
也许我没有给出具体的例子来说明我是如何使用这些模式的,这可能是一个错误,但这里有一些:
System.out.println(
"OhMyGod=MyMyMyOhGodOhGodOhGod"
.replaceAll("^(.*)(.*)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><My><God>"
// same pattern, different input string
System.out.println(
"OhMyGod=OhMyGodOhOhOh"
.replaceAll("^(.*)(.*)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><MyGod><>"
// now \2 is reluctant
System.out.println( …Run Code Online (Sandbox Code Playgroud) 需要匹配句子的第一部分,直到给定的单词.但是,该单词是可选的,在这种情况下,我想匹配整个句子.例如:
我有一句话,附有我不想要的条款.
我有一句话,我喜欢它.
在第一种情况下,我想要"I have a sentence".在第二种情况下,我想要"I have a sentence and I like it."
Lookarounds将给我第一个案例,但是一旦我尝试使其成为可选项,为了涵盖第二个案例,我得到了整个第一句话.我试过让表达懒惰......没有骰子.
适用于第一种情况的代码:
var regEx = new Regex(@".*(?=with)");
string matchstr = @"I have a sentence with a clause I don't want";
if (regEx.IsMatch(matchstr)) {
Console.WriteLine(regEx.Match(matchstr).Captures[0].Value);
Console.WriteLine("Matched!");
}
else {
Console.WriteLine("Not Matched : (");
}
Run Code Online (Sandbox Code Playgroud)
我希望的表达方式:
var regEx = new Regex(@".*(?=with)?");
Run Code Online (Sandbox Code Playgroud)
有什么建议?
提前致谢!
詹姆士
我不明白为什么这个正则表达式返回false;
Pattern.matches("\\bi", "an is");
Run Code Online (Sandbox Code Playgroud)
我在角落边界的角色!
我想从一段文本中提取一个字符串。该字符串必须以某个字符串结尾。
例:
词1 =“你好”
词2 =“世界”
文本:
Hello, this is a sentence.
The whole World can read this.
What World?
Run Code Online (Sandbox Code Playgroud)
我要提取的文本是:
Hello, this is a sentence.
The whole World
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种常规异常来提取字符串。
注意:字符串“ World”出现两次。
谢谢