String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
Убедитесь, что вы понимаете, почему. Это потому, что сравнение ==
сравнивает только ссылки; equals()
метод сопоставляет содержимое по символу.
Когда вы вызываете new для a
и b
, каждый получает новую ссылку, указывающую на "foo"
в таблице строк. Ссылки разные, но контент один и тот же.
Попробуйте:
$arr=preg_split("/\s+(?=\S*+$)/",$str);
Изменить
Краткое объяснение:
(? = ...)
называется положительным взглядом вперед . Например, a (? = B)
будет соответствовать только одному 'a'
, если следующий символ (тот, что справа от него) будет 'b'
. Обратите внимание, что 'b'
- это , а не часть совпадения!
\ S
- это просто сокращение для символа класс [^ \ s]
. Другими словами: он соответствует одному символу, кроме символа пробела. +
после *
делает класс символов \ S
притяжательным .
Наконец, $
обозначает конец строки.
Напомним, полное регулярное выражение \ s + (? = \ S * + $)
будет читаться на простом английском языке следующим образом:
соответствует одному или нескольким пробельным символам, только если смотреть вперед этих пробелов, равных нулю или более можно увидеть символы, отличные от пробелов, за которыми следует конец строки.
Это должно работать:
$str="hello this is a space";
preg_match('~^(.*)\s+([^\s]+)$~', $str, $matches);
$result = array($matches[1], $matches[2]);
Вы могли бы сделать это без регулярного выражения:
$parts = array_map('trim', explode(' ', $str));
$result = array(
implode(' ', array_slice($parts, 0, -1)),
end($parts)
);
или
$lastSpace = strrpos($str, ' ');
$str1 = trim(substr($str, 0, $lastSpace));
$str2 = trim(substr($str, $lastSpace));
$result = array( $str1, $str2 );
Если дублировать *
и +
после \ S
? Только / \ s + (? = \ S + $) /
или / \ s + (? = \ S * $) /
достаточно в зависимости от потребности.