使用单词作为分隔符拆分字符串

时间:2012-09-28 08:33:03

标签: java regex string

我正在尝试使用带有正则表达式的java中的string.split从母字符串中取出特殊字符串。

string str = "name ching chang field computer engineering grade 9.98";
string[] splits = str.split("regex");

我想使用名称,字段和成绩作为分隔符。现在正则表达式应该是什么,以便我的字符串数组(拆分)中包含以下项目:

splits[0] = "ching chang"  
splits[1] = "computer engineering"  
splits[2] = "9.98"  

3 个答案:

答案 0 :(得分:10)

String str = "name ching chang field computer engineering grade 9.98";
String[] splits = str.split("name |field |grade ");

//test with
for(String s : splits)
    System.out.println(s);

答案 1 :(得分:1)

    String str = "name ching chang field computer engineering grade 9.98";
    String[] splits = str.split("name|field|grade");
    System.out.println(Arrays.asList(splits));

答案 2 :(得分:0)

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Fieldsplitter with configurable fields
 */
public class FieldSplitter {

    private static Logger LOG = new Logger();

    /**
     * Test method
     * 
     * @param args
     *            not used
     */
    public static final void main(String[] args) {

        String[] fields = new String[] { "name", "field", "grade" };
        // regular test case
        printFieldValues(fields,
                "name ching chang field computer engineering grade 9.98");
        // missing field
        printFieldValues(fields,
                "ching chang field computer engineering grade 9.98");
        // duplicate field
        printFieldValues(fields,
                "name ching chang field computer engineering name johnny bravo grade 9.98");
    }

    /**
     * Gets the values of the fields from the input. If a field is not found the
     * value is null. If a field occurs multiple times the last value is used.
     * 
     * @param fields
     *            the known fields
     * @param input
     *            the input containing consecutive fields and their values
     *            separated by whitespace
     * @return a Map containing all known fields and their values
     */
    public static Map<String, String> getFieldValues(String[] fields,
            String input) {
        Map<String, String> fieldValues = new HashMap<String, String>();
        for (String field : fields) {
            fieldValues.put(field, null);
        }
        String[] words = input.split("\\s");
        LOG.debug("words:" + Arrays.toString(words));
        String field = null;
        int start = 0;
        for (String word : words) {
            if (fieldValues.containsKey(word)) {
                int end = input.indexOf(word, start);
                if (end < 0) {
                    throw new RuntimeException(String.format(
                            "Error: '%s' not found after position %s", word,
                            end));
                }
                if (field != null) {
                    fieldValues.put(field, input.substring(start, end));
                }
                field = word;
                start = end + word.length();
            }
        }
        if (field != null) {
            fieldValues.put(field, input.substring(start, input.length()));
        }
        return fieldValues;
    }

    private static void printFieldValues(String[] fields, String input) {
        for (Entry<String, String> field : getFieldValues(fields, input)
                .entrySet()) {
            LOG.debug(String.format("%s=%s", field.getKey(), field.getValue()));
        }
    }

    /** A simple logger */
    private static class Logger {
        void debug(String message) {
            System.out.println(message);
        }
    }
}

输出:

words:[name, ching, chang, field, computer, engineering, grade, 9.98]
grade= 9.98
name= ching chang 
field= computer engineering 
words:[ching, chang, field, computer, engineering, grade, 9.98]
grade= 9.98
name=null
field= computer engineering 
words:[name, ching, chang, field, computer, engineering, name, johnny, bravo, grade, 9.98]
grade= 9.98
name= johnny bravo 
field= computer engineering 

P.S。我刚刚发现了一个简单而方便的技巧:在Eclipse中选择你的代码然后按TAB缩进它。然后将缩进的代码复制并粘贴到Stackoverflow编辑字段中。通过这种方式,代码将立即正确呈现。