Вы можете использовать предварительное утверждение:
$string = 'DZ9243/XSHAGT FFGD JERSE XS2 DZ9232/MHAGT SUUMTE KNI M10 DZ9232/LHAGT SUMMER KNI L6';
$pieces = preg_split('@ (?=[^ ]*/)@', $string);
print_r($pieces);
Вывод:
Array
(
[0] => DZ9243/XSHAGT FFGD JERSE XS2
[1] => DZ9232/MHAGT SUUMTE KNI M10
[2] => DZ9232/LHAGT SUMMER KNI L6
)
@ (?=[^ ]*/)@
@
разделитель regex
; обычно в качестве разделителя используется /
, но это регулярное выражение пытается сопоставить /
, и поэтому лучше использовать другой разделитель; (
запускает группу; группа нужна утверждению; ?=
- положительное утверждение, ориентированное на будущее; требует, чтобы группа соответствовала входной строке, но не потребляет символы из входной строки, которая соответствует группе; [^ ]*/
- содержимое группы; он соответствует любому непробельному символу любое количество раз, за которым следует /
; это слово содержит косую черту (/
); )
оканчивает группу. В целом, regex
соответствует пробелам, за которыми следует слово, которое содержит косую черту, но слово не используется; он не включен в разделитель в preg_split()
, используется только пробел.
Вы, вероятно, не должны предполагать что асинхронное Runnable
закончится к этому времени asyncExec
назовите возвраты.
В этом случае Вы смотрите на выставление результата в слушателей/обратные вызовы (возможно Шаблон "команда"), или если Вы действительно хотите иметь результат в наличии в более позднем в том же методе, с помощью чего-то как a java.util.concurrent.Future
.
Я думаю, что Контейнер выше является "правильным" выбором. Это могло быть также быть genericized для безопасности типов. Быстрым выбором в этом виде ситуации является заключительная идиома массива. Прием - то, что любой локальные переменные, на которые ссылаются от Выполнимого, должны быть окончательными, и таким образом не могут быть изменены. Таким образом вместо этого, Вы используете единственный массив элемента, где массив является окончательным, но элемент массива может быть изменен:
final Object[] result = new Object[1];
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
public void run()
{
result[0] = "foo";
}
}
System.out.println(result[0]);
Снова, это - "быстрое" решение для тех случаев, где у Вас есть анонимный класс, и Вы хотите дать ему место для засовывания результата, не определяя определенный Контейнерный класс.
ОБНОВЛЕНИЕ После того, как я думал об этом немного, я понял, что это хорошо работает для использования типа слушателя и посетителя, где обратный вызов находится в том же потоке. В этом случае, однако, Выполнимое выполняется в другом потоке, таким образом, Вы, как гарантируют, на самом деле не будете видеть результат после syncExec возвраты. Правильное решение состоит в том, чтобы использовать AtomicReference:
final AtomicReference<Object> result = new AtomicReference<Object>();
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
public void run()
{
result.set("foo");
}
}
System.out.println(result.get());
Изменения в значении AtomicReference, как гарантируют, будут видимы всеми потоками, так же, как если бы это было объявлено энергозависимое. Это описано подробно здесь.
Ну, если это - синхронизация, у Вас может просто быть держатель значения некоторого вида, внешнего к run()
метод.
Классик:
final Container container = new Container();
Display display = Display.getDefault();
display.syncExec(new Runnable()
{
public void run()
{
container.setValue("foo");
}
}
System.out.println(container.getValue());
Где контейнер справедлив:
public class Container {
private Object value;
public Object getValue() {
return value;
}
public void setValue(Object o) {
value = o;
}
}
Это, конечно, весело и изворотливо (еще более изворотливый, создает новый Список и затем устанавливает и получает 1-й элемент), но syncExec
блоки метода, таким образом, ничто плохо не вышло из него.
Кроме тех случаев, когда кто-то возвращается позже и делает его asyncExec()
..