Маркируйте строку с пространством в Java

Можно только сделать понтонный мост имени DNS к различному IP-адресу, поэтому если Вы, Вы используете виртуальное перенаправление хостов с DNS, не будете работать.

при вводе subdomain.hostone.com в браузер он будет использовать DNS для получения, это - IP-адрес (если это будет CNAME, то он продолжит пробовать, пока это не получит IP от записи), тогда, он соединится с тем IP и отправит запрос HTTP с

Host: subdomain.hostone.com 

куда-нибудь в http заголовках.

9
задан kal 1 October 2009 в 00:21
поделиться

9 ответов

Самый простой способ сделать это - вручную реализовать простой конечный автомат. Другими словами, обрабатывайте строку по символу за раз:

  • Когда вы нажимаете пробел, разрываете токен;
  • Когда вы нажимаете цитату, продолжайте получать символы, пока не нажмете другую цитату.
9
ответ дан 4 December 2019 в 13:48
поделиться

В зависимости от форматирования исходной строки вы должны иметь возможность использовать регулярное выражение в качестве параметра к методу java "split": Щелкните здесь, чтобы увидеть пример .

В этом примере не используется регулярное выражение, которое вам может понадобиться для этой задачи.

Вы также можете использовать ] этот поток SO в качестве руководства (хотя он и на PHP), который делает что-то очень близкое к тому, что вам нужно. Небольшие манипуляции с этим могут помочь (хотя наличие кавычек в выводе или их отсутствие может вызвать некоторые проблемы). Имейте в виду, что регулярные выражения очень похожи на большинстве языков.

Изменить :

3
ответ дан 4 December 2019 в 13:48
поделиться

Это решение является одновременно общим и компактным (фактически это версия ответа Клетуса с регулярным выражением):

String line = "a=b c='123 456' d=777 e='uij yyy'";
Matcher m = Pattern.compile("('[^']*?'|\\S)+").matcher(line);
while (m.find()) {
  System.out.println(m.group()); // or whatever you want to do
}

Другими словами, найдите все серии символов, которые представляют собой комбинации строк в кавычках или непробельных символов; вложенные кавычки не поддерживаются (нет escape-символа).

0
ответ дан 4 December 2019 в 13:48
поделиться
java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(line, " ");
while (tokenizer.hasMoreTokens()) {
    String token = tokenizer.nextToken();
    int index = token.indexOf('=');
    String key = token.substring(0, index);
    String value = token.substring(index + 1);
}
-1
ответ дан 4 December 2019 в 13:48
поделиться

Предположения:

  • Имя вашей переменной ('a' в присвоении 'a = b') может иметь длину 1 или более
  • Имя вашей переменной ('a' в присвоении 'a = b') не может содержать пробел характер, все остальное в порядке.
  • Проверка введенных вами данных не требуется (предполагается, что входные данные имеют допустимый формат a = b)

У меня это работает.

Входные данные:

a=b abc='123 456' &=777 #='uij yyy' ABC='slk slk'              123sdkljhSDFjflsakd@*#&=456sldSLKD)#(

Выходные данные:

a=b
abc='123 456'
&=777
#='uij yyy'
ABC='slk slk'             
123sdkljhSDFjflsakd@*#&=456sldSLKD)#(

Код:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest {

    // SPACE CHARACTER                                          followed by
    // sequence of non-space characters of 1 or more            followed by
    // first occuring EQUALS CHARACTER       
    final static String regex = " [^ ]+?=";


    // static pattern defined outside so that you don't have to compile it 
    // for each method call
    static final Pattern p = Pattern.compile(regex);

    public static List<String> tokenize(String input, Pattern p){
        input = input.trim(); // this is important for "last token case"
                                // see end of method
        Matcher m = p.matcher(input);
        ArrayList<String> tokens = new ArrayList<String>();
        int beginIndex=0;
        while(m.find()){
            int endIndex = m.start();
            tokens.add(input.substring(beginIndex, endIndex));
            beginIndex = endIndex+1;
        }

        // LAST TOKEN CASE
        //add last token
        tokens.add(input.substring(beginIndex));

        return tokens;
    }

    private static void println(List<String> tokens) {
        for(String token:tokens){
            System.out.println(token);
        }
    }


    public static void main(String args[]){
        String test = "a=b " +
                "abc='123 456' " +
                "&=777 " +
                "#='uij yyy' " +
                "ABC='slk slk'              " +
                "123sdkljhSDFjflsakd@*#&=456sldSLKD)#(";
        List<String> tokens = RegexTest.tokenize(test, p);
        println(tokens);
    }
}
1
ответ дан 4 December 2019 в 13:48
поделиться

Вы пробовали разделить с помощью '=' и создать токен из каждой пары полученного массива?

-2
ответ дан 4 December 2019 в 13:48
поделиться

StreamTokenizer может помочь, хотя проще всего настроить прерывание на '=' , так как он всегда прерывается в начале строки в кавычках:

String s = "Ta=b c='123 456' d=777 e='uij yyy'";
StreamTokenizer st = new StreamTokenizer(new StringReader(s));
st.ordinaryChars('0', '9');
st.wordChars('0', '9');
while (st.nextToken() != StreamTokenizer.TT_EOF) {
    switch (st.ttype) {
    case StreamTokenizer.TT_NUMBER:
        System.out.println(st.nval);
        break;
    case StreamTokenizer.TT_WORD:
        System.out.println(st.sval);
        break;
    case '=':
        System.out.println("=");
        break;
    default:
        System.out.println(st.sval);
    }
}

output

Ta
=
b
c
=
123 456
d
=
777
e
=
uij yyy

Если вы пропустите две строки, которые преобразуют числовые символы в альфа, тогда вы получите d = 777.0 , что может быть вам полезным.

1
ответ дан 4 December 2019 в 13:48
поделиться
line.split(" (?=[a-z+]=)")

правильно дает:

a=b
c='123 456'
d=777
e='uij yyy'

Убедитесь, что вы адаптировали часть [a-z+] на случай, если структура ваших ключей изменится.

Edit: это решение может потерпеть неудачу, если в части значения пары есть символ "=".

3
ответ дан 4 December 2019 в 13:48
поделиться
public static void main(String[] args) {
String token;
String value="";
HashMap<String, String> attributes = new HashMap<String, String>();
String line = "a=b c='123  456' d=777 e='uij yyy'";
StringTokenizer tokenizer = new StringTokenizer(line," ");
while(tokenizer.hasMoreTokens()){
        token = tokenizer.nextToken();
    value = token.contains("'") ? value + " " + token : token ;
    if(!value.contains("'") || value.endsWith("'")) {
           //Split the strings and get variables into hashmap 
           attributes.put(value.split("=")[0].trim(),value.split("=")[1]);
           value ="";
    }
}
    System.out.println(attributes);
}

output: {d=777, a=b, e='uij yyy', c='123 456'}

В этом случае непрерывный пробел будет усечен до одиночного пробела в значении. Здесь приписанная hashmap содержит значения

0
ответ дан 4 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: