powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Разделение слов в строке с помощью регулярного выражения
21 сообщений из 21, страница 1 из 1
Разделение слов в строке с помощью регулярного выражения
    #40097273
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некая строка в которой слова разделены двумя пробелами, а буквы разделены одинарным пробелом.

Усложним задачу. Слова могут быть разделены сочетанием: одного из пробельных символов (например, \n) и произвольным количеством пробелов. Нужно с помощью регулярки разделить эти слова.

Вот не придумывается красивого решения.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097275
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удали одинарные пробелы и дальше задача - тривиальна.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097276
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Удали одинарные пробелы и дальше задача - тривиальна.

Одинарные пробелы удалять нельзя. Пока сделал так:

Код: plaintext
1.
2.
3.
    QString temp = src;
    temp.replace(QRegExp("(\\r|\\n|\\t)"), "  ");
    const QStringList words = temp.split(QRegExp("  \\s*"));


Но тут явное предположение, что кроме пробела есть только три пробельных символа. Но это же не факт?
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097278
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Слова могут быть разделены сочетанием: одного из пробельных символов (например, \n)


например - это лирика
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097281
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Но тут явное предположение, что кроме пробела есть только три пробельных символа. Но это же не факт?

Покажи нам живой пример этой чертовой строки.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097282
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
petrav

Но тут явное предположение, что кроме пробела есть только три пробельных символа. Но это же не факт?

Покажи нам живой пример этой чертовой строки.

Код: plaintext
"a a a\vb b b"
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097292
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сути, нам для сплита нужно придумать выражение: количество пробелов >= 2 или любой пробельный символ (но не единичный пробел) в сочетании любых других пробельных символов в количестве >= нуля (с обеих сторон).
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097306
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
По сути, нам для сплита нужно придумать выражение: количество пробелов >= 2 или любой пробельный символ (но не единичный пробел) в сочетании любых других пробельных символов в количестве >= нуля (с обеих сторон).

"\s\s+"
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097307
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В регулярках есть Quantifiers. Они считают количество штук символов. И символы у тебя - это спейсеры.
Ты правильно написал \\s туда входят и пробелы и ентеры и табуляторы и всякие мляцкие прогоны страниц на принтерах.

Как-то будет так.

Код: sql
1.
\\s{2,}




Вот шпаргалка хорошая по регуляркам. Иногда заглядываю туда.

https://cheatography.com/davechild/cheat-sheets/regular-expressions/
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097309
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
В регулярках есть Quantifiers. Они считают количество штук символов. И символы у тебя - это спейсеры.
Ты правильно написал \\s туда входят и пробелы и ентеры и табуляторы и всякие мляцкие прогоны страниц на принтерах.

Как-то будет так.

Код: sql
1.
\\s{2,}




Вот шпаргалка хорошая по регуляркам. Иногда заглядываю туда.

https://cheatography.com/davechild/cheat-sheets/regular-expressions/

Ну и как? Это не будет работать с такой строкой:

Код: plaintext
a a a\nb b b

Тут разделены слова!

2White Owl: Тоже самое.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097311
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня нету QT под рукой. Вот пишу на другом языке но принцип - тот-же. Убрал пробельчики и разделил по спейсерам.

Код: python
1.
2.
scala> "a a a\nb b b".replaceAll(" ","").split("\\s")
res5: Array[String] = Array(aaa, bbb)
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097315
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
У меня нету QT под рукой. Вот пишу на другом языке но принцип - тот-же. Убрал пробельчики и разделил по спейсерам.

Код: python
1.
2.
scala> "a a a\nb b b".replaceAll(" ","").split("\\s")
res5: Array[String] = Array(aaa, bbb)


Я уже говорил: нельзя удалять единичные пробелы. Кроме того тут ты вообще все пробелы удаляешь, а не только единичные. ИМХО.

Смотри. Слова могут быть разделены следующими токенами:

- Количество пробелов >= 2.
- Любой пробельный символ, но не пробел. В окружении N пробельных символов, где N >= 0. С обеих сторон.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097346
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Слова могут быть разделены следующими токенами:

- Количество пробелов >= 2.
- Любой пробельный символ, но не пробел. В окружении N пробельных символов, где N >= 0. С обеих сторон.


Код: javascript
1.
const arr = '1  2 3\n4 \t \t\t5'.split(/[ ]{2,}|\s*[\n\t\r]\s*/);



разрежется всё, кроме '2 3' - там только один простой пробел.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097349
когда уже придёт понимание...
"пишете исходную строку"
"пишете требуемую строку"
а это переливание из "а что если так" в "ну блин мне надо не так"
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097350
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
petrav
Слова могут быть разделены следующими токенами:

- Количество пробелов >= 2.
- Любой пробельный символ, но не пробел. В окружении N пробельных символов, где N >= 0. С обеих сторон.


Код: javascript
1.
const arr = '1  2 3\n4 \t \t\t5'.split(/[ ]{2,}|\s*[\n\t\r]\s*/);



разрежется всё, кроме '2 3' - там только один простой пробел.

Это, я так понимаю, JavaScript? Но не это важно.

Тут снова делается жёсткое предположение, что кроме пробела есть только три пробельных символа. А на самом деле это множество не определено с точки зрения исходного кода. В этом то и есть основная проблема.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши нам 2-3 варианта, как оно ещё может быть.

Пойдем от TDD.
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097402
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,

это что? задача по выделению слов из юникода?
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097405
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav,

Код: plaintext
1.
(?<=\b)(.+?)(?=\s{2,}|$)
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097412
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bsplesk,

Чуть не то, вот так лучше ( online link https://regex101.com/r/9gJSPx/1 )
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097417
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как выше отметили, еще бы уточнить кодировку у исходных файлов ASCII или UTF-8,Unicode или какой-нибудь UTF-32, тут возможны варианты, в том числе зависят от конкретной реализации парсера. Плюс спросить, что они имеют ввиду под "пробелом" и также могут ли слова содержать цифры и всякие знаки. Если могут то \w заменить на \S.

Пример:
Код: plsql
1.
(?=\w)(.+?)(?=(\h\s)|$)


или
Код: plsql
1.
(?=\w)(.+?)(?=( \s)|$)




\w, \h, \s - по идеи должны работать везде (на всех кодировках, если их поддерживает парсер).

\h - горизонтальный пробел (включая табы и всякие модные пробелы ...)

Но если нужен именно пробел в unicode, то можно вообще кондово прописать конкретный код - \x{0020} = U+0020 SPACE
Код: plsql
1.
(?=\w)(.+?)(?=(\x{0020}\s)|$)



https://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=oct
...
Рейтинг: 0 / 0
Разделение слов в строке с помощью регулярного выражения
    #40097485
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Тут снова делается жёсткое предположение, что кроме пробела есть только три пробельных символа. А на самом деле это множество не определено с точки зрения исходного кода. В этом то и есть основная проблема.
мне бы твои проблемы..

Код: javascript
1.
const arr = '1  2 3\n4 \t \t\t5'.split(/[ ]{2,}|\s*(?![ ])\s\s*/);



(?![ ])\s - перед пробельным символом стоит условие "сейчас не будет пробела"
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Разделение слов в строке с помощью регулярного выражения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (1), Bing Bot 9 мин.
Пользователи онлайн (7): Анонимы (5), Yandex Bot, Bing Bot 1 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]