求助:java正则表达式解析find kw=a kw1=b kw3=d c

pipi521520 2008-06-10 05:07:03
如何才能将语句解析出find kw=a kw1=b kw3=d c lc=e
a b d c e
XX=X 可能无限多
请高手帮忙
...全文
389 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianghuxiaoxiami 2008-09-12
  • 打赏
  • 举报
回复
mark by jianghuxiaoxiami
pipi521520 2008-06-13
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html?seed=257390998

强人给的修炼正则的秘籍
大家可以去看一下
  • 打赏
  • 举报
回复
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Test {

public static void main(String[] args) {
String s = "find 关键词A 关键词B 字段名1=关键词1 not 字段名2=关键词2 关键词3 or " +
"字段名3=关键词4 关键词5 关键词6 关键词7 xor 关键词8 关键词9 " +
"TS=TO 2008-06-11, FR 2007-06-11 " +
"and 字段名4=关键词10 关键词11 or 关键词12";
Pattern p = Pattern.compile("(?<=(?:^find|=|x?or|not|and) ?)(?<!TS=)((?!x?or|not|and)[^ =]+(?: |$))+");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
}
}


关键词A 关键词B
关键词1
关键词2 关键词3
关键词4 关键词5 关键词6 关键词7
关键词8 关键词9
关键词10 关键词11
关键词12
pipi521520 2008-06-13
  • 打赏
  • 举报
回复
bao110908 在csdn上面用即时聊天老是只能看到你发的消息提示,不能看你的消息内容
郁闷呀
你的MSN或QQ是多少呀?呵呵
如果方便的话可以留到这里或是发私信告诉我吗?

对了还有个问题

String s = "find 字段名1=关键词1 not 字段名2=关键词2 关键词3 or " +
"字段名3=关键词4 关键词5 关键词6 关键词7 xor 关键词8 关键词9 " +
"TS=TO 2008-06-11, FR 2007-06-11 " +
"and 字段名4=关键词10 关键词11 or 关键词12";
Pattern p = Pattern.compile("(?<=(?:=|x?or|not|and) ?)(?<!TS=)((?!x?or|not|and)[^ =]+(?: |$))+");
这个是可以用的
但是如果 String s = "find 关键词1";
就不行了
怎么结合上面那个改呀^_^
pipi521520 2008-06-12
  • 打赏
  • 举报
回复
本打算结帖的,可是还是有个问题没解决,呵呵 貌似没完没了了.请大家见谅

String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 "
+ "xor 关键词4 关键词6 TS=TO 2008-06-11, FR 2007-06-11 and 字段名4=关键词5 关键词7";
(本想让关键词6变个颜色的,可是UBB不能嵌套,只有再发一遍了,上面的帖还不能自己删除,郁闷)

在关键词6处的前面不加(and or not xor)这个语句也是对的,所以也要解析这种情况的
现在就是如何怎么解析成
关键词1
关键词2
关键词3
关键词4
关键词6
关键词5
关键词7
[顺序没要求的],怎么写表达式解析这个结果呀? 先谢谢大家的参与


再问一个若若的问题 [^ =]++  这个是什么意思呀?  [^ =]+表示 非空格和=号有1到N个 后面再加个+号就不清楚了?哪们高手能给解析一下吗?

pipi521520 2008-06-12
  • 打赏
  • 举报
回复
本打算结帖的,可是还是有个问题没解决,呵呵 貌似没完没了了.让大家见谅
String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 "
+ "xor 关键词4 关键词6 TS=TO 2008-06-11, FR 2007-06-11 and 字段名4=关键词5 关键词7";


在关键词6处的前面不加(and or not xor)这个语句也是对的,所以也要解析这种情况的
现在就是如何怎么解析成
关键词1
关键词2
关键词3
关键词4
关键词6
关键词5
关键词7
[顺序没要求的],怎么写表达式解析这个结果呀? 先谢谢大家的参与

再问一个若若的问题 [^ =]++  这个是什么意思呀?  [^ =]+表示 非空格和=号有1到N个 后面再加个+号就不清楚了?哪们高手能给解析一下吗?
ChDw 2008-06-12
  • 打赏
  • 举报
回复
(? <=X)是 零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
(? <=\\=) 表示 在匹配出来的字符串的前面必须是等号


零宽断言有四种的,具体情况你找一下正则表达式的教程吧
pipi521520 2008-06-12
  • 打赏
  • 举报
回复
帖子已经结了
只感觉bao110908 很牛
呵呵
晚上回去把正则好好研究一下
CrazyGou 2008-06-12
  • 打赏
  • 举报
回复
***
pipi521520 2008-06-12
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 bao110908 的回复:]
后面的那个加号属于匹配量词,称为侵占式量词,以最大的方式进行匹配,与 * 号(贪婪量词)
与 ? + * {} 后面什么都不加(此时称为贪婪量词) 不同的是,侵占量词在匹配成功后,并不会产生回退,不会让出已匹配成功的字符来
用于匹配表达式后面的东西。

上面红色部分说错了,应改为蓝色的部分。
[/Quote]

你跟哪儿学的呀
呵呵 ,这么系统
我只是从网上搜一些看看,都没你说的这么具体,还有贪婪量词和侵占式量词都没听过
你能发些资料给我
呵呵 Email:pipi521520@163.com
  • 打赏
  • 举报
回复
后面的那个加号属于匹配量词,称为侵占式量词,以最大的方式进行匹配,与 * 号(贪婪量词)
与 ? + * {} 后面什么都不加(此时称为贪婪量词) 不同的是,侵占量词在匹配成功后,并不会产生回退,不会让出已匹配成功的字符来
用于匹配表达式后面的东西。

上面红色部分说错了,应改为蓝色的部分。
  • 打赏
  • 举报
回复
再问一个若若的问题 [^ =]++ 这个是什么意思呀? [^ =]+表示 非空格和=号有1到N个 后面再加个+号就不清楚了

—————————————————————————————————————————————————————

[^ =]++(?! *=)

后面的那个加号属于匹配量词,称为侵占式量词,以最大的方式进行匹配,与 * 号(贪婪量词)不同的是,
侵占量词在匹配成功后,并不会产生回退,不会让出已匹配成功的字符来用于匹配表达式后面的东西。

[^ =]++ 与独立分组写法 (?>[^ =]+) 的意思是一样的,(?>) 即 java.util.regex.Pattern API DOC 中
特殊构造中的最后一个。
  • 打赏
  • 举报
回复
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test3 {

public static void main(String[] args) {
String s = "find 字段名1=关键词1 not 字段名2=关键词2 关键词3 or " +
"字段名3=关键词4 关键词5 关键词6 关键词7 xor 关键词8 关键词9 " +
"TS=TO 2008-06-11, FR 2007-06-11 " +
"and 字段名4=关键词10 关键词11 or 关键词12";
Pattern p = Pattern.compile("(?<=(?:=|x?or|not|and) ?)(?<!TS=)((?!x?or|not|and)[^ =]+(?: |$))+");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
}
}


输出的结果是一堆这样的:

关键词1 
关键词2 关键词3
关键词4 关键词5 关键词6 关键词7
关键词8 关键词9
关键词10 关键词11
关键词12


再将 while(m.find()) 改为这样就行了:

        while(m.find()) {
String[] str = m.group().split(" ");
for(int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}
shufangxieyang 2008-06-11
  • 打赏
  • 举报
回复
不明白(?<=X)这是什么意思啊
就本题而言是说找到=后面的内容吗?
(?<=\\=)
前一个\是转义
转义后(?<=\=)又是什么意思啊
  • 打赏
  • 举报
回复
没看懂~~
java6666 2008-06-11
  • 打赏
  • 举报
回复
楼主的问题不是很明白
pipi521520 2008-06-11
  • 打赏
  • 举报
回复
如何才能将语句解析出find 字段名1=关键词1 字段名2=关键词2 字段名3=关键词3 关键词4 字段名4=关键词5
怎样才能解析出 关键词1 关键词2 关键词3 关键词4 关键词5
(字段名=关键词 和 关键词 )可能无限多
其实这个是一个数据库的语句.现在我要把这个语句解析了,找出里面的关键字
就好像是Sql一样
关键字一般是在=号右边的.也可以没有XX=X号 只要输入find X 也是可以查找到X的
pipi521520 2008-06-11
  • 打赏
  • 举报
回复
其实这个是一个数据库的语句.现在我要把这个语句解析了,找出里面的关键字
就好像是Sql一样
关键字一般是在=号右边的.也可以没有XX=X号 只要输入find X 也是可以查找到X的
pipi521520 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 bao110908 的回复:]
Java codeimport java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test3 {

public static void main(String[] args) {
String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 " +
"xor 关键词4 and 字段名4=关键词5 TS=TO 2008-06-11, FR 2007-06-11 ";
Pattern p = Pattern.compile("(?<=(?:=|x?or|not|and) ?)(?<!TS=)[^ =]++(?! …
[/Quote]
服了
我要加你为好友
呵呵
MSN:pipi521520@163.com
  • 打赏
  • 举报
回复
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test3 {

public static void main(String[] args) {
String s = "find 字段名1=关键词1 not 字段名2=关键词2 or 字段名3=关键词3 " +
"xor 关键词4 and 字段名4=关键词5 TS=TO 2008-06-11, FR 2007-06-11 ";
Pattern p = Pattern.compile("(?<=(?:=|x?or|not|and) ?)(?<!TS=)[^ =]++(?! *=)");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
}
}
}


因为你现在只要

关键词1
关键词2
关键词3
关键词4
关键词5

这种样子的,TS=XX 的忽略掉,现在只能做到这些。
而且像“关键词4”那样的前面最多只允许有一个空格!(若要允许多个的话还得改表达式)
加载更多回复(20)

62,614

社区成员

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

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