正则表达式的问题

beysion 2008-03-25 05:06:47
字符
\cx 对应于 x 的控制符

java.lang.Character 类(简单的 java 字符类型)
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效于 java.lang.Character.isMirrored()

还有
Unicode 块和类别的类
\p{InGreek} Greek 块(简单块)中的字符
\p{Lu} 大写字母(简单类别)
\p{Sc} 货币符号
\P{InGreek} 所有字符,Greek 块中的除外(否定)
[\p{L}&&[^\p{Lu}]] 所有字母,大写字母除外(减去)


特殊构造(非捕获)
(?:X) X,作为非捕获组
(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off
(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
(?>X) X,作为独立的非捕获组


请问这些是什么意思啊,我不知道它们的怎么个用法,高手能不能给我举个例子啊?先谢谢了
...全文
888 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我在 11 楼的回复你没有看,\1 表示反向引用第 1 组所匹配到的东西,当然是对称的了。

而你的这个
(?<=<(.{1,3})>).*(?=</(.{1,3}))

后面的就是匹配任意字符。
beysion 2008-03-28
  • 打赏
  • 举报
回复
谢谢大家
  • 打赏
  • 举报
回复
我在 15 楼不是已经举过例子了吗?
beysion 2008-03-28
  • 打赏
  • 举报
回复
(?>X) X,作为独立的非捕获组
匹配时不进行回溯,与侵占量词的特性基本相同。
匹配时不进行回溯,与侵占量词的特性基本相同这句话不是很理解,这个能不能举个例子啊?

和这个(?:X) X,作为非捕获组的区别不是很理解,
能不能举个例子啊?
谢谢先,太不好意思了
  • 打赏
  • 举报
回复
或者这样做也可以

Pattern pattern = Pattern.compile("<([^/]+?)>(.*?)</\\1>", Pattern.DOTALL);
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println(matcher.group(2));
System.out.println();
}


Pattern.DOTALL 可以用内嵌标志“(?s)”来代替。
  • 打赏
  • 举报
回复
上面有点 bug,再改进一下。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

public static void main(String args[]) {
String str = "<b>aaaa</b>\n" +
"<h1>bbbbb</h1>\n" +
"<book>adfasdfadfasa\nsdfasdfadfasdf</book>\n" +
"<b>aaaa</b>";

Pattern pattern = Pattern.compile("(?<=<(.{1,100}?)>)(?s:.)*?(?=</\\1>)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println(matcher.group());
System.out.println();
}
}
}
  • 打赏
  • 举报
回复
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

public static void main(String args[]) {
String str = "<b>aaaa</b>\n" +
"<h1>bbbbb</h1>\n" +
"<book>adfasdfadfasa\nsdfasdfadfasdf</book>";

Pattern pattern = Pattern.compile("(?<=<(.{1,100}?)>)(?s:.)*(?=</\\1>)");
Matcher matcher = pattern.matcher(str);
while(matcher.find()) {
System.out.println(matcher.group());
System.out.println();
}
}
}
  • 打赏
  • 举报
回复
group(1) 是第一组,group(2) 是第二组,依此类推

要看第几组,从左边开始数起,数捕获组的开括号(“(?”类型的除外),第几个括号就是第几捕获组。

(?<=<(\\w{0,100})>).*(?=</\\1)"

第一个括号是 (\\w{0,100}) 这一块,所以这是第一组。

\1 这个是反向引用,只是记住 9 个捕获组 \10 表示组 1 和字符 0。
xms_999 2008-03-27
  • 打赏
  • 举报
回复
顶火龙果,好强哦!
beysion 2008-03-27
  • 打赏
  • 举报
回复
我怎么样才能把<b>aaa</b>
对称之间的内容aaa找出来啊?
<b>aaa</b2>这样的不算啊?
beysion 2008-03-27
  • 打赏
  • 举报
回复

public static void main(String[] arg) {
check("<br>aaa</br>", "(?<=<(\\w{0,100})>).*(?=</\\1)");
}

public static void check(String textStr, String mre) {
Pattern p = Pattern.compile(mre);
Matcher m = p.matcher(textStr);

int i = 1;

while (m.find()) {
System.out.println("找到第" + i + "个匹配: [" + m.group() + "]位置为: "
+ m.start() + "-" + m.end());
i++;
}



if (1 == i) {
System.out.println("no match.");
}
}



输出的结果:找到第1个匹配: [aaa]位置?: 4-7

我想知道的是:我怎么能知道\1引用的是什么内容,\2是什么内容呢?
在程序里有什么方法吗,谢谢
  • 打赏
  • 举报
回复
lookbehind 其中所指定的字符必须是指定数量的,不能用 * + 之类的,但可以用 {0, 100} 这种确定型的。

lookahead 没有这种限制。
beysion 2008-03-27
  • 打赏
  • 举报
回复
Pattern p = Pattern.compile("(?<=<(\\w+)>)");
Matcher m = p.matcher(textStr);

怎么提示我(?<=<(\\w+)>)
红色的部分出错

Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 10
(?<=<(\w+)>)
beysion 2008-03-27
  • 打赏
  • 举报
回复
(?<=<(.{1,3})>).*(?=</\\1)
和(?<=<(.{1,3})>).*(?=</(.{1,3}))
是不是一样的啊?
还是说什么区别呢?

对于
<br>aaabbb</ber>

(?<=<(.{1,3})>).*(?=</\\1)匹配不到aaabbb
(?<=<(.{1,3})>).*(?=</(.{1,3}))匹配得到,

这是什么原因呢
为什么包哥的(?<=<(.{1,100}?)>)(?s:.)*?(?=</\\1>)
这个能只匹配对称的<b>fwewf</b>呢

我那个有什么地方不妥吗?
谢谢
cchaha 2008-03-27
  • 打赏
  • 举报
回复
MARK
  • 打赏
  • 举报
回复
我在这个帖子 18 楼帖的链接估计你没看,在那个帖子 30 楼我帖了个地址,有些正则表达式的资源,可以去看看。

http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html
  • 打赏
  • 举报
回复
(?<=<(.{1,100}?)>)(?s:.)*?(?=</\\1>)

(?s:.) 将这个点用于 DOTALL 模式下,因为 <book>...</book> 中我加了个“\n”。

我看了看,不是用 (?<=<(\\w{1,100}?)>) 比用 . 好一些。
  • 打赏
  • 举报
回复
勉强是从左边一个一个地吃直到匹配为止,不加 ?的是一口吃掉整个字符串,然后从最后一个一个地吐出来直到匹配为止

字符串
a=====b=====b===

a.*b 将匹配满足条件最长的字符串 a=====b=====b

工作方式:
首先将:a=====b=====b=== 全部吃掉,从右边一个一个地吐出来

1. a=====b=====b=== 不匹配,吐出一字符
2. a=====b=====b== 不匹配,再吐出一字符
3. a=====b=====b= 不匹配,再吐出一字符
4. a=====b=====b 匹配了,结束。如果再不匹配继续吐,直到没有字符了,匹配失败

a.*? 将匹配满足条件最短的字符串 a=====b

工作方式:
从左边一个一个地吃掉字符
1. a 不能匹配表达式,继续吃
2. a= 不能匹配表达式,继续吃
3. a== 不能匹配表达式,继续吃
4. a=== 不能匹配表达式,继续吃
5. a==== 不能匹配表达式,继续吃
6. a===== 不能匹配表达式,继续吃
7. a=====b 呵呵,终于能匹配表达式了,匹配结束,匹配位置留于字符 b 后面,继续其他的匹配。如果不能匹配则一个一个地吃掉整个字符串直到吃完为止若还没有匹配则匹配失败。
beysion 2008-03-27
  • 打赏
  • 举报
回复
(? <= <(\\w{0,100})>).*(?= </\\1)

(?<=<(.{1,100}?)>)(?s:.)*?(?=</\\1>)
这个有哪些区别啊?
就加了一个Pattern.DOTALL?
在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行结束符。

为什么你这个会匹配对称的啊? 我看不出里面的奥妙,能不能再解释一下啊?

对了为什么{1,100}后面加一个?号呢,我去了好象不行
还有(?s:.)*?也加了一个?号呢)?
我知道加?是代表勉强是吧,能不能通俗一点给我讲一下啊?
去了,为什么不行呢?奇怪
谢谢先
beysion 2008-03-27
  • 打赏
  • 举报
回复
龙哥太强了
加载更多回复(22)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧