Как заменить только шаблон, а не заменить слова? - PullRequest
0 голосов
/ 24 марта 2020

Я хочу заменить символы при наборе текста. Но со следующими фрагментами кода (около 250 строк), здесь я использую replace () метод RegEx. Это проверяет против замены тоже. Я хочу, чтобы он проверял только шаблон / регулярное выражение.

Тест

m -> A //ok
M -> B //ok
, -> F //Wrong, should be C 

Как получить замену без изменения порядка строки?

<!DOCTYPE html PUBLIC "-//W3C//Dtd HTML 4.0 transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
   <meta charset="UTF-8">
     
   </head>
   <body onload="javascript:formTest.source.focus()">
      <script language="javascript" type="text/javascript">
         var text;
         
         function startConvert()
         {
         text = document.formTest.source.value;  
         			
			text = text.replace(/\u006d/g, "A");
			text = text.replace(/M/g, "B");
			text = text.replace(/,/g, "C");
			text = text.replace(/</g, "D");
			text = text.replace(/c/g, "E");
			text = text.replace(/C/g, "F");
			text = text.replace(/v/g, "G");
			text = text.replace(/V/g, "H");
			text = text.replace(/I/g, "I");
			text = text.replace(/x/g, "J");
			text = text.replace(/X/g, "K");
			text = text.replace(/xs/g, "L");
			
			text = text.replace(/\//g, "@");
         	         	
         document.formTest.destination.value=text;
         }
         
            
      </script>
      <center>
         <table width="500" >
            <tbody>
               <tr>
                  <form name="formTest">
                     <td>						  
						<textarea onkeyup="startConvert();" 
						onclick="startConvert();" 
						name="source" 
						rows="5" 
						onselect="startConvert();">
						</textarea>
					
                     </td>
                     <td>
                        <textarea 
						name="destination" rows="5"></textarea>
                     </td>
                  </form>
               </tr>
            </tbody>
         </table>
      </center>
   </body>
</html>

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

Если подстрока из более раннего .replace заменена чем-то, что ищется в более позднем .replace, результат более раннего .replace будет перезаписан более поздним. Вместо этого я бы использовал объект значений замены, содержащий только один .replace, чтобы ни один символ не проверялся и не заменялся более одного раза.

Если сопоставляемые символы могут быть символами со специальным значением в регулярные выражения, такие как [, сначала избегают их :

var text;
const replacements = {
  '\u006d': 'A',
  M: 'B',
  ',': 'C',
  '<': 'D',
  c: 'E',
  C: 'F',
  v: 'G',
  V: 'H',
  I: 'I',
  x: 'J',
  X: 'K',
  xs: 'L',
};
const pattern = new RegExp(
  Object.keys(replacements)
    .map(s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'))
    .join('|'),
  'g'
);
function startConvert() {
  document.formTest.destination.value = document.formTest.source.value
    .replace(pattern, match => replacements[match]);
}
<center>
  <table width="500">
    <tbody>
      <tr>
        <form name="formTest">
          <td>
            <textarea onkeyup="startConvert();" onclick="startConvert();" name="source" rows="5" onselect="startConvert();">
						</textarea>

          </td>
          <td>
            <textarea name="destination" rows="5"></textarea>
          </td>
        </form>
      </tr>
    </tbody>
  </table>
</center>
0 голосов
/ 24 марта 2020

Вместо проверки всей строки,

var str = document.formTest.source.value; 
var text = str .substr(str .length - 1);
text = text.replace(/\u006d/g, "A");
...

Это подойдет.

0 голосов
/ 24 марта 2020

используйте onkeyup = "functionName ()", удалите onclick () и onselect ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...