public static void main(String[] args) {
String str = "aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
System.out.println(str);
Pattern p = Pattern.compile("(<)?(《)?([^<>《》]+)(?(1)>)?(?(2)》)?");//这样会出错
//Pattern p = Pattern.compile("[<《]([^<>《》]+)[>》]");//这个会抓出伪装内层数据
//Pattern p = Pattern.compile("<([^<>《》]+)>|《([^<>《》]+)》");//这种曲线目标方式可以实现但不是用的条件匹配
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group(0));
}
}我的需求是希望匹配出 内层数据1 和内层数据2
看了关于正则条件匹配的资料 (?(id/name)yes-pattern | no-pattern) 这种但是试了很久也没能正确写出正则表达式。
这里请教各位一下,有对条件匹配比较熟悉的朋友么,希望能指点指点,谢谢了!
System.out.println(str);
regex = "[^<]*<([^>]*)>*[^《]*《([^》]*)》";
Pattern p = Pattern.compile(regex);//
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group(1));
System.out.println(m.group(2));
}
等看看有没有了解的朋友来帮给个定论或者指点下用法上的问题。
谢谢楼上几位~
//Regex reg = new Regex(@"(<(?<o>)|《(?<p>))[^<>《》]*(?(o)>|(?(p)》))");
Regex reg = new Regex(@"(?:(<)|(《))[^<>《》]*(?(1)>|(?(2)》))");
MatchCollection mc = reg.Matches(str);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n";
}
/*------输出------
<内层数据1>
《内层数据2》
*/当然,这一需求并不是非要用条件判断语法的
String test = "aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
String pattern = "<[^<>]*>|《[^《》]*》";
Matcher m = Pattern.compile(pattern).matcher(test);
while(m.find())
{
System.out.println( m.group());
}
/*------输出------
<内层数据1>
《内层数据2》
*/
import java.util.regex.Pattern;public class TextNested {
public static void main(String[] args) {
String str="aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》ddd";
Matcher m1=Pattern.compile("(?:(?<=[<])(?:.*?)(?=[>]))|(?:(?<=[《])(?:.*?)(?=[》]))").matcher(str);
while(m1.find()) {
System.out.println(m1.group());
}
}}测试结果:内层数据1
内层数据2
谢谢9楼,不过 xx|xx 这种思路的正则并不是我想要的,这里我就是想用条件匹配来实现。
System.out.println(str);
Pattern p = Pattern.compile("(?<=\\<)[\\u4e00-\\u9fa50-9]+(?=\\>)|(?<=《)[\\u4e00-\\u9fa50-9]+(?=》)");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
上次是平衡组,这次是条件匹配,希望下一版jdk能支持吧。
刚试了php的,php的都支持条件匹配,哦哦$str ="aaa<内层数据1>bbbbbb《内层数据2》ccc<伪装内层数据》dd";
$arr = array();
preg_match_all("#(?:(<)|(《))([^<>《》]+)(?(1)>)(?(2)》)#",$str,$arr);
print_r($arr[0]);挂一会,看还有哪些朋友能一起讨论下。然后就结贴了
如果java正则支持动态编译的话。想.net中的表达式树一样。
那么你可以把[<《]匹配的结果\1然后通过一个map转化成相对的>或者》。这样可能就会很强大了。
我昨天也想到 用反向引用来实现 但是不知道如何 通过\1 把 < 转化成 >不知道 哪位大侠能实现啊
限长沙上班IT族 群号 124617549
java的regex库目前还起来弱了。