String s = "find 字段名1=关键词1 字段名2=关键词2 字段名3=关键词3 关键词4 字段名4=关键词5"; Pattern p = Pattern.compile("(?<=\\=)[^ ]*"); Matcher m = p.matcher(s); while(m.find()) { System.out.println(s.substring(m.start(), m.end())); }关键词1 关键词2 关键词3 关键词5 不知道你是否要这样的输出
(?<=X) X,通过零宽度的正 lookbehind 通过零宽度的正是什么意思呀
可以用Scanner 下面给你一个例子扫描器还可以使用不同于空白的分隔符。下面是从一个字符串读取若干项的例子: String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close(); 输出为: 1 2 red blue
你是不是要找 xx=x的等式啊,
还是只查找等式右边含有a,b,d,c,e的情况.........
就好像是Sql一样
关键字一般是在=号右边的.也可以没有XX=X号 只要输入find X 也是可以查找到X的
怎样才能解析出 关键词1 关键词2 关键词3 关键词4 关键词5
(字段名=关键词 和 关键词 )可能无限多
其实这个是一个数据库的语句.现在我要把这个语句解析了,找出里面的关键字
就好像是Sql一样
关键字一般是在=号右边的.也可以没有XX=X号 只要输入find X 也是可以查找到X的
解析出[ 关键词1 关键词2 关键词3 关键词4 关键词5 ]
(字段名N=关键词N 和 关键词N )可能无限多
其实这个是一个数据库的语句.现在我要把这个语句解析了,找出里面的关键字
就好像是Sql一样
关键字一般是在=号右边的.也可以没有字段名和等号 只要输入find 关键词 也是可以查找到要查询的关键词所在文献的
我感觉已经说的够清楚了吧
就是从上面那句里用正则表达式,或是别的什么方法得到用户所输入的关键词
Pattern p = Pattern.compile("(?<=\\=)[^ ]*");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(s.substring(m.start(), m.end()));
}关键词1
关键词2
关键词3
关键词5
不知道你是否要这样的输出
下面给你一个例子扫描器还可以使用不同于空白的分隔符。下面是从一个字符串读取若干项的例子: String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close(); 输出为: 1
2
red
blue
Pattern p = Pattern.compile("(?<=(\\=| ))[^( |=)]+(?=( |$))");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println("'" + s.substring(m.start(), m.end()) + "'");
}这个可以了吧
JDK的中文API翻译有点烂,这个应该叫【零宽断言】,是正则表达式中的高级的技巧,是为了断言匹配的字符串符合某些规范的。
只是给一个建议
同时也可以用 StringTokenizer 里面也有 hasMoreTokes 这个方法,可以帮助你
Pattern p = Pattern
.compile(
"^(?:(?:Find)?\\s{1,})?\\s*[[\\P{InGreek}]+\\s*=\\s*]*(\\b\\P{InGreek}+\\b)",
Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(ccl);
int groupCount = m.groupCount();
while (m.find()) {
System.out.println(m.group());
System.out.println(m.group(1));
}
System.out.println(groupCount);
[code]
我是这样写的,可惜只能得能在这个语句System.out.println(m.group(1)); 的时候得到 关键词5
前面的就得不到了
这个还可以解析成为关键词1
关键词2
关键词3
关键词4
关键词5
吗
你的需求好复杂,像 TS=TO 这些,正则表达式根本就不认识的
单独的写正则表达式估计是不行了
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”那样的前面最多只允许有一个空格!(若要允许多个的话还得改表达式)
我要加你为好友
呵呵
MSN:[email protected]
就本题而言是说找到=后面的内容吗?
(?<=\\=)
前一个\是转义
转义后(?<=\=)又是什么意思啊
(? <=\\=) 表示 在匹配出来的字符串的前面必须是等号
零宽断言有四种的,具体情况你找一下正则表达式的教程吧
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个 后面再加个+号就不清楚了?哪们高手能给解析一下吗?
+ "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个 后面再加个+号就不清楚了?哪们高手能给解析一下吗?
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]);
}
}
侵占量词在匹配成功后,并不会产生回退,不会让出已匹配成功的字符来用于匹配表达式后面的东西。[^ =]++ 与独立分组写法 (?>[^ =]+) 的意思是一样的,(?>) 即 java.util.regex.Pattern API DOC 中
特殊构造中的最后一个。
你跟哪儿学的呀
呵呵 ,这么系统
我只是从网上搜一些看看,都没你说的这么具体,还有贪婪量词和侵占式量词都没听过
你能发些资料给我
呵呵 Email:[email protected]
只感觉bao110908 很牛
呵呵
晚上回去把正则好好研究一下
大家可以去看一下
郁闷呀
你的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";
就不行了
怎么结合上面那个改呀^_^
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