2

我在 java 中的一个简单任务需要帮助。我有以下句子:

你在哪里[员工姓名]?你有 [Shift] 班次..

我需要提取由[]符号包围的字符串。

我正在考虑使用split带有" "参数的方法,然后找到单个单词,但是如果我要查找的短语包含:" ". usingindexOf也可能是一个选项,只是我不知道我已经到达String.

执行此任务的最佳方法是什么?任何帮助,将不胜感激。

4

5 回答 5

13

尝试使用正则表达式\[(.*?)\]来匹配单词。

\[[:为文字匹配转义,因为它是一个元字符。

(.*?):以非贪婪的方式匹配所有内容。

示例代码:

Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher("Where Are You [Employee Name]? your have a [Shift] shift.");
while(m.find()) {
    System.out.println(m.group());
}
于 2013-05-05T11:13:21.660 回答
3

在这里,您可以使用 Java 正则表达式来提取两个括号之间的文本,包括空格

import java.util.regex.*;

class Main
{
  public static void main(String[] args)
  {
    String txt="[ Employee Name ]";

    String re1=".*?";   
    String re2="( )";   
    String re3="((?:[a-z][a-z]+))"; // Word 1
    String re4="( )";   
    String re5="((?:[a-z][a-z]+))"; // Word 2
    String re6="( )";   

    Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(txt);
    if (m.find())
    {
        String ws1=m.group(1);
        String word1=m.group(2);
        String ws2=m.group(3);
        String word2=m.group(4);
        String ws3=m.group(5);
        System.out.print("("+ws1.toString()+")"+"("+word1.toString()+")"+"("+ws2.toString()+")"+"("+word2.toString()+")"+"("+ws3.toString()+")"+"\n");
    }
  }
}

如果你想忽略空格删除"( )";

于 2013-05-05T11:17:32.317 回答
2

这是一个扫描仪基础解决方案

    Scanner sc = new Scanner("Where Are You [Employee Name]? your have a [Shift] shift..");
    for (String s; (s = sc.findWithinHorizon("(?<=\\[).*?(?=\\])", 0)) != null;) {
        System.out.println(s);
    }

输出

Employee Name
Shift
于 2013-05-05T11:31:04.653 回答
1

使用StringBuilder(我假设您不需要同步)。

正如您所建议的,indexOf()使用方括号分隔符将为您提供起始索引和结束索引。使用 substring(startIndex + 1, endIndex - 1) 得到你想要的字符串。

我不确定字符串的结尾是什么意思,但indexOf("[")它是开始indexOf("]")也是结束。

于 2013-05-05T11:18:25.833 回答
1

这几乎就是正则表达式的用例。尝试"(\\[[\\w ]*\\])"作为你的表达方式。

Pattern p = Pattern.compile("(\\[[\\w ]*\\])");
Matcher m = p.matcher("Where Are You [Employee Name]? your have a [Shift] shift..");

if (m.find()) {

    String found = m.group();
}

这个表达式有什么作用?

  • 首先它定义了一个组(...)
  • 然后它定义了该组的起点。\[ 匹配 [ 因为 [ 本身是正则表达式的“关键字”,它必须被 Java 字符串中保留的 \ 屏蔽,并且必须被另一个 \ 屏蔽
  • 然后它定义组的主体 [\w ]*... 这里正则表达式 [] 与 \w(意思是 \w,意思是任何字母、数字或取消划线)和空白一起使用,意思是空白。* 表示前一组的零个或多个。
  • 然后它定义了组的端点 \]
  • 并关闭组)
于 2013-05-05T11:18:30.133 回答