Регулярное выражение не совпадает с повторяющимися буквами - PullRequest
1 голос
/ 02 августа 2010
myString = "THIS THING CAN KISS MY BUTT. HERE ARE MORE SSS";
myNewString = reReplace(myString, "[^0-9|^S{2}]", "|", "All");

myNewString - "|||S||||||||||||SS||||||||||||||||||||||||SSS"

Что я хочу, так это "||||||||||||||||SS|||||||||||||||||||||||||||", что, как я думал, ^S{2} сделает (исключая ровно 2 S).Почему это соответствует любому S?Может кто-нибудь сказать мне, как это исправить?TIA.

фактическая цель Я пытаюсь проверить список значений.Допустимыми значениями могут быть 6-значные или 5-значные числа, обработанные SS, поэтому 123456, SS12345 - допустимый список.то, что я пытаюсь сделать, это превратить все, что не является SS или числом, в новый разделитель, потому что я не могу контролировать ввод.например, 123456 И SS12345 следует изменить на 123456 ||||| SS12345.после изменения |разделитель на, результат 123456, SS12345.Если бы пользователь должен был ввести 123456 PLUS, SS12345 заканчивается 123456 |||| S | SS12345, что = 123456, S, SS12345, что недопустимо, и пользователь получает ошибку, но она должна быть действительной, если она не соответствует одиночнойS.

Ответы [ 3 ]

8 голосов
/ 02 августа 2010

[^0-9|^S{2}] на самом деле означает:

[^     # any character except
  0-9  #  0 to 9
  |    #  a vertical bar
  ^    #  a caret 
  S    #  an S            <-----
  {    #  an open brace
  2    #  a 2, and
  }    #  a close brace
]

Следовательно, не соответствует любому S.

, так как CodeFusion не поддерживает просмотр назад или обратный вызовв замене, я не думаю, что это может быть решено просто с помощью REReplace.

Я не знаю CF, но я попробую что-то вроде:

resultString = "";
sCount = 0
for character in myString + "$":
  if character == 'S':
    sCount += 1
  else:
    if sCount == 2:
      resultString += "SS"
    else:
      resultString += "|" * sCount
    sCount = 0
    if isdigit(character):
      resultString += character
    else:
      resultString += "|"
resultString = resultString[:-1]
2 голосов
/ 02 августа 2010

Правильно ли я прочитал это, потому что вы хотите заменить все, кроме ровно двух последовательных S символов?

Это ограничено одним вызовом замены или вы можете выполнить его через несколько операций регулярного выражения?Если допускается несколько операций, может быть проще выполнить строку через одно регулярное выражение, совпадающее с S{3,} (чтобы выбрать экземпляры из трех или более S символов), а затем через вторую, которая использует ([^S])S([^S]) (дляподобрать одиночные S символов).Третий забег может совпадать с остальной частью вашего правила ([^0-9]).

2 голосов
/ 02 августа 2010

Вы используете отрицательный символьный класс с [^ ....], любой символ НЕ в 0-9|^S{2} будет заменен, поэтому 0-9, ^, { & } также сохранятся. Отрицательное сопоставление реальных строк вместо символов было бы довольно сложно. Просто заменить «SS {2}» будет: (?<!S)SS(?!S), что угодно, НО «SS» вряд ли выполнимо. Мои лучшие усилия были бы (?<=SS)S|S(?=SS)|(?<=S)S(?=S)|(?<!S)S(?!S)|[^S0-9], но я не могу этого гарантировать.

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