JS регулярное выражение, выходящее из кавычек - PullRequest
3 голосов
/ 20 июля 2010

Я хочу экранировать все кавычки, которые идут только после текста H1:

Например,

H1: "text here"

должно стать:

H1: "text here"

Thisбыло бы легко с lookbehind, но это не в JS.

что-то, что я пробовал:

.replace(/H1:(.*)(")(.*)/ig, "H1:$1"$2")

Также это должно работать с другим подобным текстом, как:

H1: ""text here""
H1: "text "here""
H1: ""text here"

Ответы [ 4 ]

1 голос
/ 21 июля 2010

Разделите текст на строки, затем для каждой строки, которая начинается с «H1», просто выполните замену.

Просто имейте в виду, что символ «может быть заменен движком JavaScript с реальной цитатойесли он встроен в HTML. (Изменить: его заменили, когда я попытался написать его прямо в этом ответе).

1 голос
/ 20 июля 2010

Вот один из подходов:

function encodeQuotesOccuringAfter(string, substring) {
    if(string.indexOf(substring) == -1) {
        return string;
    }

    var all = string.split(substring);
    var encoded = [all.shift(), all.join(substring).replace(/"/g, """)];

    return encoded.join(substring)
}

Этот второй является немного расточительным, но вы можете переместить это в функцию и вычислить startAt только один раз.Идея состоит в том, чтобы искать все кавычки и изменять только те, которые имеют «H1:» перед ними.

str.replace(/"/g, function(match, offset, string) {
    var startAt = string.indexOf("H1:");
    if(startAt != -1 && offset > startAt) {
        return """;
    }
    else {
        return '"';
    }
});

Используя наше знание области, что H1: не содержит кавычек, мы просто делаем заменуна всю строку.

str.replace(/"/g, """);
0 голосов
/ 21 июля 2010

Сначала я разбил строку на строки. Затем я делаю замену текста только на правильных строках, и пока я делаю замену текста, я объединяю все строки вместе:

<script type="text/javascript">
  // Create a test string.
var string='H1: "text here" \nH1: test "here" \nH2: not "this" one';
  // Split the string into lines
array = string.split('\n');
  // Iterate through each line, doing the replacements and 
  // concatenating everything back together
var newString = "";
for(var i = 0; i < array.length; i++) {
      // only do replacement if line starts H1
      // /m activates multiline mode so that ^ and $ are start & end of each line
    if (array[i].match(/^H1:/m) ) {
          // Change the line and concatenate
          // I used &quote; instead of &quote; so that the changes are
          // visible with document.write
        newString += array[i].replace(/"/g, '&quote;') + '\n';    
    } else {
          // only concatenate
        newString += array[i] + '\n';
    }
}
document.write(newString);
</script>
0 голосов
/ 21 июля 2010

попробуйте это:

.replace(/H1:(.*?)(")(.*?)/ig, "H1:$1&quot;$3")

*?Соответствует 0 или более из предыдущего токена.Это ленивое совпадение, и оно будет соответствовать как можно меньшему числу символов, прежде чем соответствовать следующему токену.

Это веб-сайт, который я использую для тестирования регулярных выражений: http://gskinner.com/RegExr/

...