2015-10-01 4 views
1

PreludePowershell: с помощью -split « s +», в отличие от .split « s +»

Я пытаюсь выполнить операцию, которая требует от меня для разбора каждого отдельного слова конкретного файла. Самый простой способ сделать это было бы, чтобы загрузить текст с помощью:

$content = Get-Content -Path .\<filename> 

Тогда я сломаю каждое отдельное слово в отдельную строку (это позволяет мне делать подсчет слов И ни одного слова поиск очень быстро) , Проблема заключается в том, когда я затем использовать эту строку кода:

$content.split("\s+") 

, который должен создать новую линию (сплит) на каждом (один или более) символ пробела. К сожалению, мои результаты выглядят следующим образом:

$content.split("\s+") 
The SpeechSynthe 
izer cla 

provide 
acce 

to the functionality of a 
peech 
ynthe 
i 
    engine that i 
    in 
talled on the ho 
t computer. In 
talled 
peech 
ynthe 
i 
engine 

Но когда я бегу

$content -split("\s+") 

Результаты будут выходить правильно:

$content -split("\s+") 
The 
SpeechSynthesizer 
class 
provides 
access 
to 
the 
functionality 
of 
a 
speech 
synthesis 

Мой вопрос Использование Powershell V.4 У меня возникли проблемы с пониманием разницы между выполнением операции.

$ content.split ("\ s +")

и

$content -split("\s+") 

есть. И почему они выводят разные результаты.

Является ли эта функциональность просто сломанной?

Есть ли какая-то другая разница, о которой я не знаю здесь?

ответ

2

См Powershelladmin wiki:

Оператор -split принимает регулярное выражение, и разделить на произвольное количество пробелов, вы можете использовать регулярное выражение "\s+".

И

Для разделения на одного или нескольких, символов, вы можете также использовать метод System.String объекта Split().

PS C:\> 'a,b;c,d'.Split(',') -join ' | '
a | b;c | d
PS C:\> 'a,b;c,d'.Split(',;') -join ' | '
a | b | c | d

Итак, вы только что прошли символы, нужно разделить на с $content.split("\s+"), а не регулярное выражение, чтобы соответствовать пустое пространство.

В $content -split("\s+"), \s+ является регулярным выражением шаблона согласования 1 или более пробельных символов.

+0

Итак, вы говорите, что метод System.String не поддерживает регулярное выражение, и поэтому «\ s +» не означает * одно или несколько пробелов * в контексте «$ content.split (« \ s + ») ' Верный? –

+1

Заметьте, что я говорю не только об этом, но ваш пример говорит сам за себя: все '' 'письма были разделены. * Synthe ** s ** izer * и т. Д. Ваш '$ content.split (" \ s + ")' разделяет 's' и' + '(я думаю,' '\' 'считается неправильным escape-символом и игнорируется). Попробуйте сами. –

+0

Теперь, когда вы указываете это; Теперь я вижу, что это именно то, от чего оно раскалывается! Я также тестировал против $ content.split ("") ', и он работает точно так, как ожидалось. Спасибо, сэр! –

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