Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вложенность в ругулярных выражениях (https://javascript.ru/forum/misc/11016-vlozhennost-v-rugulyarnykh-vyrazheniyakh.html)

artwalek 02.08.2010 13:59

Вложенность в ругулярных выражениях
 
Всем привет.
Помогите пожалуйста сделать вложенную замену в регулярном выражении в исходных данных вида "Hello "world", yahoo!", в «Hello «world», yahoo!»

Сделал замену без вложенностей так:
function replace(node) {
	var decs = node[0].text;
	var quote = /"([^"]*)"/g;
	decs = decs.replace(quote, '«$1»');
	return decs;
}


Спасибо.

Kolyaj 02.08.2010 14:33

А как скрипт должен догадаться, так нужно заменять «Hello «world», yahoo!» или так «Hello »world«, yahoo!»? Кавычки-то не отличаются друг от друга.

artwalek 02.08.2010 14:51

Цитата:

Сообщение от Kolyaj (Сообщение 65995)
А как скрипт должен догадаться, так нужно заменять «Hello «world», yahoo!» или так «Hello »world«, yahoo!»? Кавычки-то не отличаются друг от друга.

Спасибо за замечание, упустил из виду, вложенные кавычки должны быть вида: «Hello „world“, yahoo!»

Kolyaj 02.08.2010 14:53

Нет, вы не поняли. Вот встретили вы в строке кавычку ". На что её нужно заменить: «, », „ или “?

artwalek 02.08.2010 15:02

Цитата:

Сообщение от Kolyaj (Сообщение 65998)
Нет, вы не поняли. Вот встретили вы в строке кавычку ". На что её нужно заменить: «, », „ или “?

Хорошо, поясню так.
Допустим, в предложении у нас нет вложенных кавычек:
В "Интерросе" это подтвердили, хотя в марте—апреле компания говорила о такой возможности.

Но могут быть предложения, где имеют быть место вложенные кавычки, пример:
"Любой buy-back, когда ты ("Интеррос".— "Ъ") управляешь менеджментом и регистратором, это всегда непропорциональная покупка акций".

Мне необходимо заменить кавычки вида "" на типографские — «» в случае если нет вложенных кавычек, т. е. так:
В «Интерросе» это подтвердили, хотя в марте—апреле компания говорила о такой возможности.

и так, если есть вложенные кавычки:
«Любой buy-back, когда ты („Интеррос“.— „Ъ“) управляешь менеджментом и регистратором, это всегда непропорциональная покупка акций».

Стало понятней?

Kolyaj 02.08.2010 15:20

Цитата:

Сообщение от artwalek
Но могут быть предложения, где имеют быть место вложенные кавычки, пример:
"Любой buy-back, когда ты ("Интеррос".— "Ъ") управляешь менеджментом и регистратором, это всегда непропорциональная покупка акций".

Вы упорно не хотите формализовать задачу. Это вам, человеку, понятно, что тут вложенные кавычки. А как глупая машина должна понять, что здесь именно вложенные кавычки, а не несколько блоков текста, заключённых в кавычки, идущие друг за другом. В этом примере, например, в кавычках находится три блока текста

Любой buy-back, когда ты (
.—
) управляешь менеджментом и регистратором, это всегда непропорциональная покупка акций

Как эту ситуацию отличить от вложенных кавычек?

artwalek 02.08.2010 15:35

Цитата:

Сообщение от Kolyaj (Сообщение 66005)
Вы упорно не хотите формализовать задачу. Это вам, человеку, понятно, что тут вложенные кавычки. А как глупая машина должна понять, что здесь именно вложенные кавычки, а не несколько блоков текста, заключённых в кавычки, идущие друг за другом. В этом примере, например, в кавычках находится три блока текста

Любой buy-back, когда ты (
.—
) управляешь менеджментом и регистратором, это всегда непропорциональная покупка акций

Как эту ситуацию отличить от вложенных кавычек?

Думаю формализовать так: делать либо вложенную замену, либо двойной проход строки. Второй вариант мне кажется предпочтительней: сперва менять все на левую кавычку, а а на втором менять каждую вторую.

Kolyaj 02.08.2010 15:42

Цитата:

Сообщение от artwalek
Второй вариант мне кажется предпочтительней: сперва менять все на левую кавычку, а а на втором менять каждую вторую.

Так никогда не будет вложенных кавычек. Вы всё-таки не понимаете всего масштаба проблемы. Тут, например, какие кавычки, вложенные или нет?

"aaa"bbb"ccc"

Может вам лучше типограф попробовать заюзать?

artwalek 02.08.2010 15:47

Цитата:

Сообщение от Kolyaj (Сообщение 66010)
Так никогда не будет вложенных кавычек. Вы всё-таки не понимаете всего масштаба проблемы. Тут, например, какие кавычки, вложенные или нет?

"aaa"bbb"ccc"

Может вам лучше типограф попробовать заюзать?

Возможно и не осознаю, для меня это пока в новинку.

"aaa"bbb"ccc" — я думаю вложенные.
Типограф Лебедевский не подходит, нужно именно на JS.

Kolyaj 02.08.2010 15:51

Цитата:

Сообщение от artwalek
"aaa"bbb"ccc" — я думаю вложенные.

Почему?

Цитата:

Сообщение от artwalek
Типограф Лебедевский не подходит, нужно именно на JS.

Можно бэкенд на сервере сделать, и подгружать результаты JS-ом.

artwalek 02.08.2010 16:42

Цитата:

Сообщение от Kolyaj (Сообщение 66012)
Почему?

Тут согласен, не очевидная вложенность.

Kolyaj 02.08.2010 16:44

Ваши примеры только для человека очевидны. Запрограммировать это будет не так просто.

artwalek 02.08.2010 16:47

Цитата:

Сообщение от Kolyaj (Сообщение 66018)
Ваши примеры только для человека очевидны. Запрограммировать это будет не так просто.

Чтож, буду стараться, спасибо :thanks:

artwalek 02.08.2010 16:49

Цитата:

Сообщение от Kolyaj (Сообщение 66012)
Почему?

Хотя ваш пример вполне работоспособен, если отделить сущности пробелами
http://www.erlang.com.ru/devanagari

рони 03.08.2010 00:58

как вариант, при условии что "точка и пробел" это конец предложения )))
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title></title>
</head>
<body>
 <script language="JavaScript" type="text/javascript">
 var str = 'В "Интерросе" это подтвердили, хотя в марте—апреле компания говорила о такой возможности.\
 "Любой buy-back, когда ты ("Интеррос".— "Ъ") управляешь менеджментом и регистратором, это всегда непропорциональная покупка акций".';
 function g(a) {
    a = a.split(/\.\s/);
    for (var c = /^"(.*?)"(\.?)$/g, d = /("(.*?)")/g, b = 0; b < a.length; b++) if (c.test(a[b])) {
        a[b] = a[b].replace(c, "&lsaquo;&lsaquo;$1&rsaquo;&rsaquo;$2");
        a[b] = a[b].replace(d, "&bdquo;$2&ldquo;")
    } else a[b] = a[b].replace(d, "&lsaquo;&lsaquo;$2&rsaquo;&rsaquo;");
    return a.join(". ")
};
document.write(g('"aaa"bbb"ccc"')+"<br />");
document.write(g('"Hello "world", yahoo!"')+"<br />");
document.write(g(str))
</script>
</body>
</html>

artwalek 03.08.2010 07:41

Спасибо рони.
Кстати можно ещё подглядеть реализацию http://www.erlang.com.ru/devanagari


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