Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2016, 13:34   #1
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию Не находить в строке определенные символы

Здравствуйте

При помощи регулярного выражения,
в строке, начиная с десятого символа, нахожу комбинацию из двух символов -
первый найденный символ, это любая цифра от 0 до 9
второй символ, который следует сразу за цифрой - это любая буква латинского алфавита
В дальнейшем такие комбинации символов сравниваю.
Код:
substring(9).match(/\d[a-z]/ig)
Но не получается сделать противоположное - если в строке цифра, а за ней любая буква латинского алфавита (например, 1A) - то такие комбинации символов не сравнивать.
Код HTML:
<input type="text" value="" id="eurocode">
<input type="button" value="go" id="send">
<table border="1" cellspacing="0" cellpadding="0">
<tr>
    <td>Модификации:</td>
    <td id="modification_decode"></td>
</tr>
</table>
Код:
<script type='text/javascript'>
$('#send').click(function(){
    var eurocode = $('#eurocode').val();
    var decode6 = {
        '1A' : 'Измененеи размеров (толщина)',
        '6B' : 'Изменение шелкографии',
        'ZZ' : 'Изменение выступа'
    };
    var resultDC6 = '';
    var tmpString6 = '';
    for(i = 0; i < eurocode.substring(9).match(/\d[a-z]/ig).length; i++){ //как сделать противоположное - 
        tmpString6 += eurocode.substring(9).match(/\d[a-z]/ig)[i]; // если в строке цифра, а за ней любая буква латинского алфавита (например, 1A) - такие комбинации символов не сравнивать.
        for(var key in decode6){
            if(tmpString6.indexOf(key) + 1){
                resultDC6 += decode6[key] + '; ';
                tmpString6 = '';
                break;
            };
        };
    };
    $('#modification_decode').text(resultDC6.slice(0, -2)); 
});
</script>
Пожалуйста, помогите решить задачу или регулярным выражением или условием типа:
Код:
if(eurocode.substring(9).match(/\d[a-z]/ig)) {
	// если в строке цифра, а за ней любая буква латинского алфавита (например, 1A) - такие комбинации символов не сравнивать
};

Последний раз редактировалось sashgera; 03.10.2016 в 16:22.
sashgera вне форума Ответить с цитированием
Старый 03.10.2016, 19:46   #2
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от sashgera Посмотреть сообщение
первый найденный символ, это любая цифра от 0 до 9
второй символ, который следует сразу за цифрой - это любая буква латинского алфавита
В дальнейшем такие комбинации символов сравниваю.
. . .
Но не получается сделать противоположное - если в строке цифра, а за ней любая буква латинского алфавита (например, 1A) - то такие комбинации символов не сравнивать.
sashgera, не понятно, какие комбинации вам, таки, надо сравнивать, а какие - нет. Можете прояснить?

В любом случае, повторять много раз строку substring(9).match(/\d[a-z]/ig) - плохо. Код получается непрозрачным(плохо читается) и если надо поменять эту регулярку - будете потом лазить по всему коду. Лучше заменить на
Код HTML:
var arr = substring(9).match(/\d[a-z]/ig);   // Массив совпадений с регуляркой.
и далее работать с ним:

Код HTML:
var arr = substring(9).match(/\d[a-z]/ig);   // Массив совпадений с регуляркой.
for(i = 0; i < arr.length; i++){
  tmpString6 += arr[i];
  . . .
  }
Итак, после реуглярки /\d[a-z]/ig в массиве $arr мы имеем набор элементов цифра+буква: '1A', '6B', '1Z', '8D', '1L'.
Что с чем надо сравнивать?
predefined вне форума Ответить с цитированием
Старый 03.10.2016, 21:03   #3
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

predefined, я опишу задачу подробнее
имеются два массива:
в первом только символы латинского алфавита, например:
'A' : 'Антенна',
во втором - цифра и символ латинского алфавита, например:
'1A' : 'Изменение размеров (толщина)',
Массивы сравниваются и результат выводится в разных ячейках таблицы

Если в инпуте набрать '1A', произойдет сравнение со вторым массивом и в таблицу запишется - Изменение размеров (толщина)
а вот дальше проблема
в первом массиве также есть символ 'A', хотя он и без цифры, но этот символ также будет сравниваться. Как это избежать?
Код HTML:
<input type="text" value="" id="eurocode">
<input type="button" value="go" id="send">
<table id="tab_decode" class="hid" border="1" cellspacing="0" cellpadding="0">
<tr>
	<td>Характеристики:</td>
	<td id="character_decode"></td>
</tr>
<tr>
	<td>Модификации:</td>
	<td id="modification_decode"></td>
</tr>
</table>
Код:
<script type='text/javascript'>
$('#send').click(function(){
	var eurocode = $('#eurocode').val();
	
	/* ПЕРВЫЙ МАССИВ */
	var decode5 = {
		'A' : 'Антенна',
		'B' : 'Правый руль',
		'C' : 'Место для камеры'
	};
 
	var resultDC5 = '';
	var tmpString = '';
	for(i = 0; i < eurocode.substring(9).length; i++){
		tmpString += eurocode.substring(9)[i];
		for(var key in decode5){
			if(tmpString.indexOf(key) + 1){
				resultDC5 += decode5[key] + '; '; 
				tmpString = '';
				break;
			};
		};
	};
	$('#character_decode').text(resultDC5.slice(0, -2)); 
	
	/* ВТОРОЙ МАССИВ */
	var decode6 = {
		'1A' : 'Измененеи размеров (толщина)',
		'6B' : 'Изменение шелкографии',
		'6C' : 'Изменение выступа'
	};
 
	var resultDC6 = '';
	var tmpString6 = '';
	for(i = 0; i < eurocode.substring(9).length; i++){
		tmpString6 += eurocode.substring(9)[i];
		for(var key in decode6){
			if(tmpString6.indexOf(key) + 1){
				resultDC6 += decode6[key] + '; '; 
				tmpString6 = '';
				break;
			};
		};
	};
	$('#modification_decode').text(resultDC6.slice(0, -2)); 
	
});
</script>
sashgera вне форума Ответить с цитированием
Старый 04.10.2016, 00:16   #4
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

А). Если у вас в инпуте вводится длинная строка 'B1AC6C', то код ниже должен работать. Он сначала собирает в массив arr6 комбинации Цифра+Буква и убирает их из строки. Потом в другой массив arr5 собираются оставшиеся Буквы:
Код:
<script type='text/javascript'>
$('#send').click(function(){
	var eurocode = $('#eurocode').val();
	eurocode = eurocode.substring(9);

	var arr6 = eurocode.match(/\d[a-z]/ig);		// Собираем 'Цифра+Буква'
	for (var key in arr6)						// Убираем найденные 'Цифра+Буква'
	  eurocode = eurocode.replace(arr6[key], '');
	var arr5 = eurocode.match(/[a-z]/ig);		// Собираем оставшиеся 'Буквы'

	/* ПЕРВЫЙ МАССИВ */
	var decode5 = {
		'A' : 'Антенна',
		'B' : 'Правый руль',
		'C' : 'Место для камеры'
	};
 	resultDC5 = '';
	for(i in arr5) {
		for(var key in decode5){
			if(arr5[i].indexOf(key) + 1){
				resultDC5 += decode5[key] + '; '; 
				break;
			};
		};
	};
	$('#character_decode').text(resultDC5.slice(0, -2)); 
	
	/* ВТОРОЙ МАССИВ */
	var decode6 = {
		'1A' : 'Измененеи размеров (толщина)',
		'6B' : 'Изменение шелкографии',
		'6C' : 'Изменение выступа'
	};
 
	var resultDC6 = '';
	for(i in arr6) {
		for(var key in decode6){
			if(arr6[i].indexOf(key) + 1){
				resultDC6 += decode6[key] + '; '; 
				break;
			};
		};
	};
	$('#modification_decode').text(resultDC6.slice(0, -2)); 
	
});
</script>
* сделаны циклы for(i in arr6) {} потому, что for (var i=0; i<arr5.length; i++) {} кидает ошибку когда arr5/arr6 - null, те в строке нет просто 'Буква' или нет комбинаций 'Буква+Цифра'

* надо бы ещё проверять и убирать дубли элементов (для строк типа: 'AAAA6C6C6C')


Б). Если у вас в инпуте вводится только одно из значений: '1A' или 'B' или '6C' - то поиск можно сделать проще: сразу искать его в ваших массивах.
Если там 1 символ - искать в массиве decode5.
Если там 2 символа - искать в массиве decode6.

Последний раз редактировалось predefined; 04.10.2016 в 00:29.
predefined вне форума Ответить с цитированием
Старый 04.10.2016, 01:03   #5
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от predefined Посмотреть сообщение
Если у вас в инпуте вводится только одно из значений: '1A' или 'B' или '6C' - то поиск можно сделать проще: сразу искать его в ваших массивах.
в инпут значения могут вводиться по разному: только '1A' или только 'B' или '1A' + 'B', или вообще не вводиться

predefined, все отлично работает! Большое спасибо!!!
sashgera вне форума Ответить с цитированием
Старый 12.11.2016, 17:09   #6
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

predefined, ваш код отлично работает на тестовой странице, но почему то не хочет работать на сайте
если не трудно посмотрите, пожалуйста
вот тестовая страница, если, например, кликнуть по ссылке в 25 строке - все работает
А вот страница сайта, если кликнуть по ссылке на той же 25 строке - консоль показывает ошибку:
Код:
TypeError: arr5[i].indexOf is not a function	
if(arr5[i].indexOf(key) + 1){
sashgera вне форума Ответить с цитированием
Старый 12.11.2016, 18:31   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

предефайнед больше не с вами, приказал всем писать за него

надо форы править
come-on вне форума Ответить с цитированием
Старый 12.11.2016, 20:29   #8
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
надо форы править
come-on, а что с for не так, на одной странице цикл выполняется, а на другой нет?
sashgera вне форума Ответить с цитированием
Старый 12.11.2016, 20:31   #9
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

по всей територии погода хорошая а в деревне гадюкино дожди

мне все равно где и что выполняется, на сайте не работает, это важнее
come-on вне форума Ответить с цитированием
Старый 12.11.2016, 23:03   #10
sashgera
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 21
По умолчанию

сделал так, теперь без ошибок
Код:
if($(arr5).length){
	for(var i=0; i<arr5.length; i++){
		for(var key in decode5){
			if(arr5[i].indexOf(key) + 1){
				resultDC5 += decode5[key] + '; '; 
				break;
			};
		};
	};
};
// arr6 так же
sashgera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Символы в строке KT82 Общие вопросы C/C++ 4 21.01.2016 20:20
Ввод текста. Найти и удалить в тексте определенные символы RIKISHI007 Общие вопросы C/C++ 3 07.11.2013 12:36
как удалить определенные символы(буквы) из предложения? emdroof C# (си шарп) 3 04.04.2013 00:20
найти определенные числа в строке fize Помощь студентам 3 15.01.2010 11:26
Вводится строка. Находить наибольший символ в строке Stud13 Общие вопросы C/C++ 4 13.06.2009 14:39