Java 用于保留引号、单引号、连字符和在空白处拆分的正则表达式

Java 用于保留引号、单引号、连字符和在空白处拆分的正则表达式,java,regex,Java,Regex,我使用Java模式类将正则表达式指定为字符串 以身作则 我喜欢做蜘蛛侠:“彼得·帕克” 应将蜘蛛侠和“彼得·帕克”列为单独的标记。 谢谢 试试看{ BufferedReader br=新的BufferedReader(新文件读取器(f)); StringBuilder sb=新的StringBuilder(); String line=br.readLine(); while(行!=null){ 某人附加(行); line=br.readLine(); } String everything=s

我使用Java模式类将正则表达式指定为字符串

以身作则 我喜欢做蜘蛛侠:“彼得·帕克”

应将蜘蛛侠和“彼得·帕克”列为单独的标记。 谢谢

试试看{
BufferedReader br=新的BufferedReader(新文件读取器(f));
StringBuilder sb=新的StringBuilder();
String line=br.readLine();
while(行!=null){
某人附加(行);
line=br.readLine();
}
String everything=sb.toString();
列表结果=新建ArrayList();
Pattern pat=Pattern.compile(([\'].*?[\']|[^]+);
PatternTokenizer pt=新的PatternTokenizer(新StringReader(一切),pat,0);
while(pt.incrementToken()){
add(pt.getAttribute(chartermatAttribute.class.toString());
}
}
捕获(例外e){
抛出新的运行时异常(e);
}
所以我猜“someword”不起作用的原因是因为每个标记本身就是一个字符串。
有什么线索吗?谢谢

检查此正则表达式是否满足您的需要:

"([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))"
尚未对每个输入进行测试,但我已对该输入进行了测试:

"    sdfsdf \" sdfs  sdfsdfs \"   \"sdfsdf\"  sdfsdf   sdfsd  dsfshj sdfsdf-sdf  'sdfsdfsdf  sd f '  "
// I used replaceAll to check the captured group
.replaceAll("([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))", "X$1Y")
要提取匹配项,请执行以下操作:

Matcher m = Pattern.compile(regex).matcher(inputString);
List<String> tokens = new ArrayList<String>();
while (m.find()) {
    tokens.add(m.group(1));
}
Matcher m=Pattern.compile(regex).Matcher(inputString);
List tokens=new ArrayList();
while(m.find()){
添加(m.group(1));
}

检查此正则表达式是否满足您的需要:

"([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))"
尚未对每个输入进行测试,但我已对该输入进行了测试:

"    sdfsdf \" sdfs  sdfsdfs \"   \"sdfsdf\"  sdfsdf   sdfsd  dsfshj sdfsdf-sdf  'sdfsdfsdf  sd f '  "
// I used replaceAll to check the captured group
.replaceAll("([\"'].*?[\"']|(?<=[ :]|^)[a-zA-Z0-9-]+(?=[ :]|$))", "X$1Y")
要提取匹配项,请执行以下操作:

Matcher m = Pattern.compile(regex).matcher(inputString);
List<String> tokens = new ArrayList<String>();
while (m.find()) {
    tokens.add(m.group(1));
}
Matcher m=Pattern.compile(regex).Matcher(inputString);
List tokens=new ArrayList();
while(m.find()){
添加(m.group(1));
}

如果它不必是正则表达式,并且字符串中的数据是正确的(引号顺序正确,不像
“'some data'”
),那么您可以像

String data="I love being spider-man : \"Peter Parker\" or 'photo reporter'";

List<String> tokens = new ArrayList<String>();
StringBuilder sb=new StringBuilder();
boolean inSingleQuote=false;
boolean indDoubleQuote=false;

for (char c:data.toCharArray()){
    if (c=='\'') inSingleQuote=!inSingleQuote;
    if (c=='"') indDoubleQuote=!indDoubleQuote;
    if (c==' ' && !inSingleQuote && !indDoubleQuote){
        tokens.add(sb.toString());
        sb.delete(0,sb.length());
    }
    else 
        sb.append(c);
}
tokens.add(sb.toString());
System.out.println(tokens);

如果它不必是正则表达式,并且字符串中的数据是正确的(引号顺序正确,不像
“'some data'”
),那么您可以在一次迭代中这样做

String data="I love being spider-man : \"Peter Parker\" or 'photo reporter'";

List<String> tokens = new ArrayList<String>();
StringBuilder sb=new StringBuilder();
boolean inSingleQuote=false;
boolean indDoubleQuote=false;

for (char c:data.toCharArray()){
    if (c=='\'') inSingleQuote=!inSingleQuote;
    if (c=='"') indDoubleQuote=!indDoubleQuote;
    if (c==' ' && !inSingleQuote && !indDoubleQuote){
        tokens.add(sb.toString());
        sb.delete(0,sb.length());
    }
    else 
        sb.append(c);
}
tokens.add(sb.toString());
System.out.println(tokens);

你试过使用StringTokenizer吗?没有,我读到在SO本身上使用它不是一个好的实践。所以我想使用Lucene API的patterntokenizer类,该类需要一个正则表达式来将字符串拆分为令牌。我认为您不能使用
split()
或类似的方法来处理这种情况。您是否尝试过使用StringTokenizer?不,我了解到在So本身上使用它不是一种好的做法。所以我想使用Lucene API的patterntokenizer类,该类需要一个正则表达式来将字符串拆分为标记。我认为您不能使用
split()
或类似的方法来处理此情况。感谢您的回答。假设它用于拆分字符串,这不起作用。它返回许多空标记。即使是用于匹配,也只有连字符起作用,但引号部分不起作用。只是看到了更新的正则表达式!除了“some-word”被拆分为“some-and-word”这一事实之外,它是有效的。有办法吗?感谢youu@YuNo:
“some word”
对我来说是正确的(1个令牌),而
some word
将被分成2个令牌。(JRE 7)非常感谢!工作几乎完美,我会找出一些引号。谢谢你的回答。假设它用于拆分字符串,这不起作用。它返回许多空标记。即使是用于匹配,也只有连字符起作用,但引号部分不起作用。刚刚看到了更新的正则表达式!除了“some-word”被拆分为“some-and-word”这一事实之外,它是有效的。有办法吗?感谢youu@YuNo:
“some word”
对我来说是正确的(1个令牌),而
some word
将被分成2个令牌。(JRE 7)非常感谢!工作几乎完美,我会找出一些报价。谢谢你的回答!但很抱歉,它必须是正则表达式。它用于文档标记化。谢谢您的回答!但很抱歉,它必须是正则表达式。它用于文档标记化。