从Java中的字符串中提取包含符号的单词

时间:2013-09-29 06:26:13

标签: java regex

基本思想是我想用“text1.text2”形式提取字符串的任何部分。我想做的输入和输出的一些例子是:

"employee.first_name" ==> "employee.first_name"
"2 * employee.salary AS double_salary" ==> "employee.salary"

到目前为止,我只有.split(“”),然后找到了我需要的东西和.split(“。”)。有没有更清洁的方式?

4 个答案:

答案 0 :(得分:2)

我会使用实际的Pattern和迭代查找,而不是分割String

例如:

String test = "employee.first_name 2 * ... employee.salary AS double_salary blabla e.s blablabla";
// searching for a number of word characters or puctuation, followed by dot, 
// followed by a number of word characters or punctuation
// note also we're avoiding the "..." pitfall
Pattern p = Pattern.compile("[\\w\\p{Punct}&&[^\\.]]+\\.[\\w\\p{Punct}&&[^\\.]]+");
Matcher m = p.matcher(test);
while (m.find()) {
    System.out.println(m.group());
}

输出:

employee.first_name
employee.salary
e.s

注意:要简化Pattern,您只能列出形成“。”的允许标点符号 - 类别中的单词

例如:

Pattern p = Pattern.compile("[\\w_]+\\.[\\w_]+");

这样,foo.bar*2将匹配为foo.bar

答案 1 :(得分:1)

您需要使用split将字符串分解为片段。然后使用.方法在每个片段中搜索contains,以获取所需的片段:

你走了:

public static void main(String args[]) {
    String str = "2 * employee.salary AS double_salary";
    String arr[] = str.split("\\s");
    for (int i = 0; i < arr.length; i++) {
        if (arr[i].contains(".")) {
            System.out.println(arr[i]);
        }
    }
}

答案 2 :(得分:0)

String mydata = "2 * employee.salary AS double_salary";
pattern = Pattern.compile("(\\w+\\.\\w+)");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find())
{
  System.out.println(matcher.group(1));
}

答案 3 :(得分:0)

我不是JAVA的专家,但是当我在python中使用正则表达式并基于互联网教程时,我建议你使用r'(\S*)\.(\S*)'作为模式。我在python中试过它,它在你的例子中运行良好。

但是如果你想连续使用多个点,那就有一个bug。我的意思是,如果您尝试匹配first.second.third之类的内容,此模式会将('first.second', 'third')标识为匹配组,我认为它与最佳匹配策略相关。