Regex для разделения строки только последним пробельным символом

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" в таблице строк. Ссылки разные, но контент один и тот же.

13
задан chattsm 7 October 2009 в 10:53
поделиться

3 ответа

Попробуйте:

$arr=preg_split("/\s+(?=\S*+$)/",$str);

Изменить

Краткое объяснение:

(? = ...) называется положительным взглядом вперед . Например, a (? = B) будет соответствовать только одному 'a' , если следующий символ (тот, что справа от него) будет 'b' . Обратите внимание, что 'b' - это , а не часть совпадения!

\ S - это просто сокращение для символа класс [^ \ s] . Другими словами: он соответствует одному символу, кроме символа пробела. + после * делает класс символов \ S притяжательным .

Наконец, $ обозначает конец строки.

Напомним, полное регулярное выражение \ s + (? = \ S * + $) будет читаться на простом английском языке следующим образом:

соответствует одному или нескольким пробельным символам, только если смотреть вперед этих пробелов, равных нулю или более можно увидеть символы, отличные от пробелов, за которыми следует конец строки.

44
ответ дан 1 December 2019 в 17:47
поделиться

Это должно работать:

$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 );
3
ответ дан 1 December 2019 в 17:47
поделиться

Если дублировать * и + после \ S ? Только / \ s + (? = \ S + $) / или / \ s + (? = \ S * $) / достаточно в зависимости от потребности.

0
ответ дан 1 December 2019 в 17:47
поделиться
Другие вопросы по тегам:

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