我在java中需要一个简单的任务帮助。我有以下句子:
您[员工姓名]在哪里? 你有[Shift]班..
我需要提取[
和]
符号所包围的字符串。
我正在考虑将split
方法与" "
参数一起使用,然后查找单个单词,但如果我正在查找的短语包含:{{1},我会遇到问题}。使用" "
也可能是一个选项,只是我不知道我到达indexOf
末尾的迹象是什么。
执行此任务的最佳方法是什么? 任何帮助将不胜感激。
答案 0 :(得分: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());
}
答案 1 :(得分: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");
}
}
}
如果您想忽略空格,请删除"( )";
答案 2 :(得分: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
答案 3 :(得分:1)
使用StringBuilder(我假设您不需要同步)。
如您所知,indexOf()
使用方括号分隔符将为您提供起始索引和结束索引。使用substring(startIndex + 1,endIndex - 1)来获得你想要的字符串。
我不确定你在字符串结尾处的含义是什么,但indexOf("[")
是开始,indexOf("]")
是结束。
答案 4 :(得分: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();
}
这个表达是做什么的?