Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Массив по нескольким разделителям. (https://javascript.ru/forum/misc/50658-massiv-po-neskolkim-razdelitelyam.html)

BSI 06.10.2014 16:54

Массив по нескольким разделителям.
 
Прошу помощи ! Необходимо переделать следующий код (или дайте совет как это осуществить):
var str = rawValue;
var FIO =str.split (' ');
var a = FIO.length
switch (a) {
 case 2:{
    FIO [0] = FIO [0].charAt (0).toUpperCase () + FIO [0].substr (1);
    FIO [1] = FIO [1].charAt (0).toUpperCase () + FIO [1].substr (1);
  rawValue = FIO.join (' ');
    FIO [0] = FIO [0].charAt (0) + FIO [0].substr (1);
    FIO [1] = FIO [1].charAt (0) + FIO [1].substr (1);
 this.resolveNode("PervBolshie").rawValue = FIO.join (' ');
       break;
 } 
     case 3:{
        FIO [0] = FIO [0].charAt (0).toUpperCase () + FIO [0].substr (1);
        FIO [1] = FIO [1].charAt (0).toUpperCase () + FIO [1].substr (1); 
        FIO [2] = FIO [2].charAt (0).toUpperCase () + FIO [2].substr (1); 
   rawValue = FIO.join (' '); 
        FIO [0] = FIO [0].charAt (0) + FIO [0].substr(1);
        FIO [1] = FIO [1].charAt (0)+ FIO [1].substr (1);
        FIO [2] = FIO [2].charAt (0)+ FIO [2].substr (1);
   this.resolveNode("PervBolshie").rawValue = FIO.join (' '); 
        break;
}
  default:
    rawValue = str;   
   this.resolveNode("PervBolshie").rawValue = str;
 }

в результате выполнения кода - первые буквы первых трех слов становятся Заглавные.
split () вроде бы не дает возможности разбить строку по нескольким разделителям, а join () объединить по тем же самым разделителям.

Код надо изменить так, чтобы результат был следующий: исходная строка - петров-сикорский юсуп маратович оглы,
результат выполнения кода Петров-Сикорский Юсуп Маратович оглы.

Я в программировании первоклассник, данный код сваять получилось, а вот дальше проблема. Наверное вопрос решаем с помощью регулярных выражений, но я с ними практически не знаком. Прошу помощи. Всем спасибо.

Erolast 06.10.2014 17:35

(" " + "петров-сикорский юсуп маратович оглы").replace(/\s./g, function(entry) {return entry.toUpperCase()}).substr(1);

http://javascript.ru/basic/regular-expression

BSI 06.10.2014 19:06

Пробую в песочнице вот так;
alert(" " + "петров-сикорский юсуп маратович оглы").replace(/\s./g, function(entry) {return entry.toUpperCase()}).substr(1);
В результате получаю петров-сикорский юсуп маратович оглы.
Что-то вроде не работает? Что делаю неправильно?

Erolast 06.10.2014 19:27

Да. Ты сперва вывел (" " + "петров-сикорский юсуп маратович оглы"), а затем к возвращенному результату (undefined) применил методы replace и substr (получив ошибку). Надо в скобки все выражение обернуть:
alert((" " + "петров-сикорский юсуп маратович оглы").replace(/\s./g, function(entry) {return entry.toUpperCase()}).substr(1))

BSI 06.10.2014 19:33

Огромное спасибо. То что надо. Все же мир не без добрых людей.

Aetae 06.10.2014 19:45

alert(
  "петров-сикорский юсуп маратович оглы".replace(/([\s-']|^)\S/g, function(entry) {return entry.toUpperCase()})
)

рони 06.10.2014 20:34

Цитата:

Сообщение от BSI
результат выполнения кода Петров-Сикорский Юсуп Маратович оглы.

:)
alert(("петров-сикорский юсуп маратович оглы").split(' ').map(function(a,i) { return i > 2 ? a : a.replace(/([а-яё])([а-яё]+)/gi, function (a, b, c){return b.toUpperCase()+c})}).join(' '))

Aetae 06.10.2014 20:37

На самом деле тут следует использовать лингвистическую библиотеку. Нюансов больно много чтоб изобретать велосипед.

BSI 06.10.2014 22:21

Это я собираюсь использовать только в личных целях. Меня пока все устраивает. По форумам искал что-то подобное так не нашел. Надо разобраться с этими регулярными выражениями. Еще раз спасибо.

III 13.10.2014 10:59

У РОНИ ответ, на поставленный вопрос, верный, а у Aetae в верхний регистр переводятся первые буквы всех слов, что несколько не соответствует поставленному требованию.
Я не спец в этих вопросах, но мне также необходимо решить данную задачу, но несколько в другом ключе. Данный скрипт
this.rawValue=(("rawValue).split(' ').map(function(a,i) { return i > 2 ? a : a.replace(/([а-яё])([а-яё]+)/gi, function (a, b, c){return b.toUpperCase()+c})}).join(' '))
работает при потери полем фокуса. Как бы тоже самое сделать в момент ввода текста в поле?
Делал форму в LiveCycle Designer, в поле ввод всего текста производится в нижнем регистре и текст отображается в поле сразу в верхнем регистре. Осуществлялось это функцией:
function VerchReg(newsymbol) 
{
	var re = /[0-9А-Яа-я\-\s]/;//Разрешен ввод только цифр,кириллицы,знака переноса и пробела
	if (re.test(newsymbol))
	{
		return newsymbol.toUpperCase();
	}
	else 
	{
		return "";
	} 	
}

и ее вызовом
form1.#subform[0].Серия_полиса::change - (JavaScript, client)
if (xfa.event.newText.length > xfa.event.prevText.length && xfa.event.change.length == 1)
{
 	xfa.event.change = xfa.form.form1.variables.Validation.VerchReg(xfa.event.change);
}
else
{
	xfa.event.change = "";
}

Хотелось бы чтобы скрипт РОНИ работал по этому же принципу.
Помогите простому пользователю, если несложно.
Всем спасибо.


Часовой пояс GMT +3, время: 22:14.