Можно только сделать понтонный мост имени DNS к различному IP-адресу, поэтому если Вы, Вы используете виртуальное перенаправление хостов с DNS, не будете работать.
при вводе subdomain.hostone.com в браузер он будет использовать DNS для получения, это - IP-адрес (если это будет CNAME, то он продолжит пробовать, пока это не получит IP от записи), тогда, он соединится с тем IP и отправит запрос HTTP с
Host: subdomain.hostone.com
куда-нибудь в http заголовках.
Самый простой способ сделать это - вручную реализовать простой конечный автомат. Другими словами, обрабатывайте строку по символу за раз:
В зависимости от форматирования исходной строки вы должны иметь возможность использовать регулярное выражение в качестве параметра к методу java "split": Щелкните здесь, чтобы увидеть пример .
В этом примере не используется регулярное выражение, которое вам может понадобиться для этой задачи.
Вы также можете использовать ] этот поток SO в качестве руководства (хотя он и на PHP), который делает что-то очень близкое к тому, что вам нужно. Небольшие манипуляции с этим могут помочь (хотя наличие кавычек в выводе или их отсутствие может вызвать некоторые проблемы). Имейте в виду, что регулярные выражения очень похожи на большинстве языков.
Изменить :
Это решение является одновременно общим и компактным (фактически это версия ответа Клетуса с регулярным выражением):
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-символа).
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);
}
Предположения:
У меня это работает.
Входные данные:
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);
}
}
Вы пробовали разделить с помощью '=' и создать токен из каждой пары полученного массива?
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
, что может быть вам полезным.
line.split(" (?=[a-z+]=)")
правильно дает:
a=b
c='123 456'
d=777
e='uij yyy'
Убедитесь, что вы адаптировали часть [a-z+] на случай, если структура ваших ключей изменится.
Edit: это решение может потерпеть неудачу, если в части значения пары есть символ "=".
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 содержит значения