3

正規表現を使用してJavaでstring.splitを使用して、マザー文字列から特別な文字列を取り出そうとしています。

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

name、field、gradeという単語を区切り文字として使用したいと思います。次に、文字列配列(分割)に次の項目が含まれるように、正規表現をどのようにする必要がありますか。

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

3 に答える 3

13
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);
于 2012-09-28T08:41:29.173 に答える
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));
于 2012-09-28T08:42:31.430 に答える
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 

PS 些細だが便利なトリックを発見しました。Eclipse でコードを選択し、TAB キーを押してインデントします。次に、インデントされたコードをコピーして Stackoverflow 編集フィールドに貼り付けます。このようにして、コードはすぐに正しくレンダリングされます。

于 2012-09-28T12:37:10.300 に答える