Что нового

[Данные, строки] Удалить символы в 3ем слове (например, Отчество)

rafzak

Новичок
Сообщения
27
Репутация
1
Здравствуйте. Подскажите пожалуйста какой использовать код для этих задач обрезки:
Дано
Иванов Иван Иванович
Нужно
1-Иванов Иван И
2-Иванов Иван

Спасибо.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Данные, строки] Удалить символы после 2х пробелов

rafzak,
Можно, например, так.
Код:
$sStr = 'Иванов Иван Иванович'

ConsoleWrite(StringLeft($sStr, StringInStr($sStr, ' ', 2, -1) + 1) & @LF)
ConsoleWrite(StringLeft($sStr, StringInStr($sStr, ' ', 2, -1) - 1) & @LF)



Добавлено:
Сообщение автоматически объединено:

Или так.
Код:
$sStr = 'Иванов Иван Иванович'

ConsoleWrite(StringLeft($sStr, StringInStr($sStr, ' ', 2, 2) + 1) & @LF)
ConsoleWrite(StringLeft($sStr, StringInStr($sStr, ' ', 2, 2) - 1) & @LF)
 
Автор
R

rafzak

Новичок
Сообщения
27
Репутация
1
Re: [Данные, строки] Удалить символы после 2х пробелов

Спасибо, условие выполняется, но извиняюсь есть один изъян: зачем обрезается при исходном "Иванов Иван" до "Иванов И" (скрипт1) до "И"(скрипт2), можно ли это убрать? Или нужно поставить логику, не обрезать если в строке 1 пробел?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Данные, строки] Удалить символы после 2х пробелов

rafzak [?]
есть один изъян: зачем обрезается при исходном "Иванов Иван"
Тема Вами названа
Удалить символы после пробелов
и в вопросе
Дано
Иванов Иван Иванович
Если Вы меняете условия, то продумайте их все и выложите.


Добавлено:
Сообщение автоматически объединено:

А количество пробелов можно узнать так:
Код:
StringReplace($sStr, ' ', '')
ConsoleWrite(@extended & @LF)
 
Автор
R

rafzak

Новичок
Сообщения
27
Репутация
1
Re: [Данные, строки] Удалить символы после 2х пробелов

Прошу прощения что, не всё обдумал, вот пожалуй то, что хотел бы видеть:
-Обрезать отчество, если оно есть, в 2х вариантах - оставлять первую букву или совсем удалять
-Если его нет, то ничего не трогать
-Учесть возможность наличия нескольких пробелов, даже перед фамилией

Спасибо за помощь
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Re: [Данные, строки] Удалить символы после 2х пробелов

У меня как-то так получилось.
Код:
$text1 = 'Иванов Иван Иванович'
$text2 = 'Иванов Иван'
$pattern1 = '(\S+?\h+?\S+?\h+?\S).+'
$pattern2 = '(\S+?\h+?\S+).*'
ConsoleWrite('Если отчество присутствует, то оставляем одну букву или убираем полность' & @LF)
ConsoleWrite(StringRegExpReplace($text1, $pattern1, '$1') & @LF)
ConsoleWrite(StringRegExpReplace($text1, $pattern2, '$1') & @LF)
ConsoleWrite('Если отчество отсутствует, то ничего не делаем' & @LF)
ConsoleWrite(StringRegExpReplace($text2, $pattern1, '$1') & @LF)
ConsoleWrite(StringRegExpReplace($text2, $pattern2, '$1') & @LF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Данные, строки] Удалить символы после 2х пробелов

rafzak [?]
-Обрезать отчество, если оно есть, в 2х вариантах - оставлять первую букву или совсем удалять
-Если его нет, то ничего не трогать
-Учесть возможность наличия нескольких пробелов, даже перед фамилией
Может что-то и не предусмотрел.
Код:
Local $a_Names[7] = [6, ' иваНОВ' & @CR & 'ивАн' & @LF & 'иванович ', ' Иванов  Иван иЛЬИЧ', '  иванова   анна - женщина    ', _
		' Иванов  Иван -  мужчина', '  иванова' & @CRLF & 'анна  никитиЧНА  ', ' иванова' & @TAB & 'анна  Сергеевна  ']

ConsoleWrite('С первой буквой отчества:' & @LF)
For $i = 1 To $a_Names[0]
	ConsoleWrite($i & '. До: "' & $a_Names[$i] & '", После: "' & _FormatName($a_Names[$i]) & '"' & @LF)
Next
ConsoleWrite('-----' & @LF)
ConsoleWrite('Только фамилия и имя:' & @LF)
For $i = 1 To $a_Names[0]
	ConsoleWrite($i & '. До: "' & $a_Names[$i] & '", После: "' & _FormatName($a_Names[$i], 0) & '"' & @LF)
Next

Func _FormatName($s_Name, $i_First = 1)
	Local $s_Tmp, $a_Tmp, $s_New

	$s_Tmp = StringStripWS(StringRegExpReplace($s_Name, '[[:space:]]', ' '), 7)
	$a_Tmp = StringSplit($s_Tmp, ' ')
	Switch $a_Tmp[0]
		Case 1
			$s_New = StringUpper(StringLeft($s_Tmp, 1)) & StringLower(StringTrimLeft($s_Tmp, 1))
		Case 2
			For $i = 1 To 2
				$s_New &= StringUpper(StringLeft($a_Tmp[$i], 1)) & StringLower(StringTrimLeft($a_Tmp[$i], 1)) & ' '
			Next
		Case Else
			For $i = 1 To 2
				$s_New &= StringUpper(StringLeft($a_Tmp[$i], 1)) & StringLower(StringTrimLeft($a_Tmp[$i], 1)) & ' '
			Next
			If $i_First Then
				Switch StringRight($a_Tmp[3], 3)
					Case 'вич', 'ьич', 'вна', 'чна'
						$s_New &= StringUpper(StringLeft($a_Tmp[3], 1))
				EndSwitch
			EndIf
	EndSwitch
	Return StringStripWS($s_New, 2)
EndFunc   ;==>_FormatName

Поменяйте, пожалуйста, название темы.
 
Верх