Регулярное выражение для сопоставления пар слов, соединенных двоеточиями - PullRequest
4 голосов
/ 03 марта 2010

Я не знаю регулярных выражений вообще. Кто-нибудь может мне помочь с одним очень простым регулярным выражением, которое

извлечение ' word: word ' из предложения. например, "Учебник по Java Формат: Pdf С Расположение: Токио Javascript"?

  • Маленькая модификация: первое слово из списка, а второе - что угодно. "слово1 в [ABC, FGR, HTY]"
  • ребята, ситуация требует немного больше модификация. Форма соответствия может быть «word11: word12 word13 ..» до следующего «word21: ...».

все усложняется с сек ..... я должен учиться reg ex :(

заранее спасибо.

Ответы [ 7 ]

7 голосов
/ 03 марта 2010

Вы можете использовать регулярное выражение:

\w+:\w+

Пояснение:
\w - один символ, представляющий собой букву (заглавную или строчную), цифру или _.
\w+ - один или несколько из вышеперечисленных символов .. в основном слово

так \w+:\w+ будет соответствовать пара слов, разделенных двоеточием.

2 голосов
/ 03 марта 2010

Попробуйте \b(\S+?):(\S+?)\b. Группа 1 будет захватывать «Формат», а группа 2 - «Pdf».

Рабочий пример:

<html>
<head>
<script type="text/javascript">
function test() {
    var re = /\b(\S+?):(\S+?)\b/g; // without 'g' matches only the first
    var text = "Java Tutorial Format:Pdf With Location:Tokyo  Javascript";

    var match = null;
    while ( (match = re.exec(text)) != null) {
        alert(match[1] + " -- " + match[2]);
    }

}
</script>
</head>
<body onload="test();">

</body>
</html>

Хорошая ссылка для регулярных выражений: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp

1 голос
/ 03 марта 2010

Продолжение работы Яу с вашим дополнительным требованием:

function test() {
    var words = ['Format', 'Location', 'Size'],
            text = "Java Tutorial Format:Pdf With Location:Tokyo Language:Javascript", 
            match = null;
    var re = new RegExp( '(' + words.join('|') + '):(\\w+)', 'g');
    while ( (match = re.exec(text)) != null) {
        alert(match[1] + " = " + match[2]);
    }
}
1 голос
/ 03 марта 2010

Использовать этот фрагмент:

 
$str=" this is pavun:kumar hello world bk:systesm" ;
if ( preg_match_all  ( '/(\w+\:\w+)/',$str ,$val ) )
 {
 print_r ( $val ) ;
 }
 else
 {
 print "Not matched \n";
 }
0 голосов
/ 06 апреля 2017

Я сейчас решаю эту проблему в своем приложении nodejs и обнаружил, что это, как мне кажется, подходит для парных формулировок:

([\w]+:)("(([^"])*)"|'(([^'])*)'|(([^\s])*))

Также соответствует указанному значению. как a:"b" c:'d e' f:g

Пример кодирования в es6:

const regex = /([\w]+:)("(([^"])*)"|'(([^'])*)'|(([^\s])*))/g;
const str = `category:"live casino" gsp:S1aik-UBnl aa:"b" c:'d e' f:g`;
let m;

while ((m = regex.exec(str)) !== null) {
   // This is necessary to avoid infinite loops with zero-width matches
   if (m.index === regex.lastIndex) {
      regex.lastIndex++;
   }

   // The result can be accessed through the `m`-variable.
   m.forEach((match, groupIndex) => {
      console.log(`Found match, group ${groupIndex}: ${match}`);
   });
}

Пример кодирования в PHP

$re = '/([\w]+:)("(([^"])*)"|\'(([^\'])*)\'|(([^\s])*))/';
$str = 'category:"live casino" gsp:S1aik-UBnl aa:"b" c:\'d e\' f:g';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

Вы можете проверить / проверить выражения регулярных выражений с помощью этого онлайн-инструмента: https://regex101.com

Кстати, если regex101.com не удален, вы можете просмотреть этот пример кода здесь

0 голосов
/ 03 марта 2010

вот способ без регулярных выражений, на вашем любимом языке, разделить на пробелы, пройти элемент, проверить «:», распечатать их, если найден. Например, Python

>>> s="Java Tutorial Format:Pdf With Location:Tokyo Javascript"
>>> for i in s.split():
...     if ":" in i:
...         print i
...
Format:Pdf
Location:Tokyo

Вы можете выполнить дополнительные проверки, чтобы убедиться, что это действительно «someword: someword», снова разделив «:» и проверив, есть ли 2 элемента в разделенном списке. например,

>>> for i in s.split():
...     if ":" in i:
...         a=i.split(":")
...         if len(a) == 2:
...             print i
...
Format:Pdf
Location:Tokyo
0 голосов
/ 03 марта 2010
([^:]+):(.+)

Значение: (все, кроме: один или несколько раз),:, (любой символ один или несколько раз)

В сети вы найдете хорошие руководства ... Возможно, вам пора учиться ...

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