2015-03-18 7 views
1

Это мой код:PowerShell использовать регулярное выражение для разбиения строки

[regex]::split("1,2 3", '(,|\s)+') 

То, что я хочу, это массив с тремя элементами 1, 2, 3, однако, что я получил это массив с пятью элементами.

PS C:\Users\a> [regex]::split("1,2 3", '(,|\s)+').Length 
5 
PS C:\Users\a> 

Как получить то, что я хочу?

Update

Добавить фактический split результат вместо length.

PS E:\> [regex]::split("1,2 3", '(,|\s)+') 
1 
, 
2 

3 
PS E:\> [regex]::split("1,2 3", '(,|\s)+').length 
5 
PS E:\> [regex]::split("1,2 3", '[,\s]+') 
1 
2 
3 
PS E:\> [regex]::split("1,2 3", '[,\s]+').length 
3 
PS E:\> 

Update

Спасибо @ ответ Мэтта и он указывает мне на правую сторону. От help about_split в документе указывается, что:

По умолчанию разделитель опускается из результатов. Чтобы сохранить все или часть разделителя, заключите в круглые скобки ту часть, которую вы хотите сохранить. .

Ниже приведены некоторые из моих испытаний.

PS E:\tutorial>  "Lastname/:/FirstName/:/Address" -split "/(:)/" 
Lastname 
: 
FirstName 
: 
Address 
PS E:\tutorial>  "Lastname/:/FirstName/:/Address" -split "/:/" 
Lastname 
FirstName 
Address 
PS E:\tutorial>  "Lastname/:/FirstName/:/Address" -split "(/:/)" 
Lastname 
/:/ 
FirstName 
/:/ 
Address 
PS E:\tutorial>  "Lastname/:/FirstName/:/Address" -split "/:(/)" 
Lastname 
/
FirstName 
/
Address 
PS E:\tutorial>  "Lastname/:/FirstName/:/Address" -split "(/):(/)" 
Lastname 
/
/
FirstName 
/
/
Address 
PS E:\tutorial>  "Lastname/:/FirstName/:/Address" -split "(/)(:)(/)" 
Lastname 
/
: 
/
FirstName 
/
: 
/
Address 
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '/(:)/') 
Lastname 
: 
FirstName 
: 
Address 
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '/:/') 
Lastname 
FirstName 
Address 
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '/:(/)') 
Lastname 
/
FirstName 
/
Address 
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '(/):(/)') 
Lastname 
/
/
FirstName 
/
/
Address 
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '(/)(:)(/)') 
Lastname 
/
: 
/
FirstName 
/
: 
/
Address 
PS E:\tutorial> 
+0

Я не знаю Powershell, но на многих языках, используя группу в регулярном выражении, означает, что разделители попадут в список (было бы интересно увидеть содержимое списка). Работает ли '[, \ s] +'? – Biffen

+0

Используйте '' '[regex] :: split (" 1,2 3 ",", | \ s + ")' ''. – Phylogenesis

+0

@Phylogenesis Это изменяет значение регулярного выражения, однако, из одной или нескольких запятых или пробелов в запятую или одно или несколько пробелов. – Biffen

ответ

3

В PowerShell при использовании -split функцию, если у вас есть часть матча в скобках вы просите за этот матч должен быть возвращен, а также. Я уверен, что то же самое верно и для статического метода [regex]. Рассмотрим вывод из двух следующих команд (которые похожи на вас) и вы увидите

[regex]::split("1,2 3", '(,|\s+)') 

1 
, 
2 

3 

[regex]::split("1,2 3", ',|\s+') 

1 
2 
3 

В первом примере вы видите, что запятая и пробел были возвращены в качестве элементов. Объяснение приведено в About_Split

По умолчанию разделитель опускается из результатов. Чтобы сохранить все или часть разделителя, заключите в круглые скобки ту часть, которую вы хотите сохранить .

В данном конкретном случае

Как указывался в комментариях есть 2 более идеальные регулярные выражения строки, которые будут обрабатывать этот конкретный случай лучше

(?:,|\s)+ или [,\s]+

Бывшего используя не захватывающая группа и лестница, являющиеся классом символов.

+0

Обратите внимание, что эти регулярные выражения сильно отличаются от OP (хотя для этого конкретного ввода результаты оказываются одинаковыми). Он должен быть либо '(?:, | \ S) +' или '[, \ s] +'. – Biffen

+1

', + | \ s +' is * not * эквивалентно '(, | \ s) +' (и я не говорю о группе захвата). Последний будет соответствовать сочетанию пробелов и запятых, но первый будет соответствовать последовательности того или другого. – Biffen

+0

@Biffen. Да ты прав. Я вернул редактирование. Оставляя это, это доказывает суть. Спасибо за разъяснения. – Matt

Смежные вопросы