2015-07-29 2 views
6

Так что я делаю программу для анализа дергаться чат, и мне интересно, если есть способ, которым я могу использовать регулярное выражение для разбора следующие в желаемый результат:RegExp обнаруживает несколько однобуквенных экземпляров в строке?

"f o o b a r" into "foobar"

До сих пор код Я это /(?:(\w)\s){3,}/g и это работает в определенной степени, но рассмотрим следующую ситуацию:

"FrankerZ R I O T FrankerZ" улавливает «Т» (последняя буква в "R I O T") и выбирает "Z R I O T"

То, что я хотел бы для этого является выяснить, как определить, есть ли одна буква с пробелом до и после нее, и если их не менее 3 из строк (так что "test a b test" не выбран как ab, только фиксируется, если есть 3+)

Любая помощь? Благодаря!

ответ

1

Спасибо Сэму Бернсу за предложение использовать \ b. То, что работает для меня:

/\b((?:\w ?\b){3,})/g

Этот выбор будет следующее:

H Y P E из FrankerZ H Y P E FrankerZ, и f o o b a r (не заканчивается или начинается с пробела, дает мне вопросы, как скважина)

Задать буквенный пробел " " символ вместо \s был также важен для избежания разрывов строк и других случаев, когда я хотел только t o проверить только пробельный символ в первую очередь.

Чтобы заменить его без пробелов, я просто сделаю .replace(" ",""), чтобы получить точный результат, который я хотел. Еще раз спасибо за помощь каждого :)

-1

Вместо того чтобы использовать регулярные выражения, вы могли бы сделать функцию, которая принимает строку, разбивает строку на пространстве, то возвращает все отдельные буквы

function findSingleLetters(string){ 
     var split = string.split(" "); 
     var word= []; 
     for(int i=0;i<split.length; i++){ 
      if(split[i].length==1){ 
       word.push(split[i]); 
      } 
     } 
     return word.toString().replace(/,/g,""); //join the word array and replace all the remaining commas(,) 
    } 
+0

Разве это не просто дало бы мне все однобуквенные слова? Что, если кто-то скажет: «Это тест, RIOT», он даст вам «a, r, i, o, t» », поэтому я хочу, чтобы он начинал захватывать, когда есть 3+ экземпляра одиночных букв подряд. Любая идея, как я буду включать это в код, который вы написали? – Flipybitz

-1

\b является нулевой шириной утверждения, что соответствует разрыву между уставом слова и символом без слова. Например, /\b\w\s/ соответствует R в rZ R I, но не Z: Z не следует за словом break или переходом между символами слов и неслов. Попытайтесь положить это в начало своего регулярного выражения, чтобы показать, что вы не хотите, чтобы он начинался с совпадения в середине слова.

+0

Спасибо! Это было именно то, что мне было нужно, я бы + репутация, но мне не хватило репутации для того, чтобы это сделать. Я отправлю свой ответ на этот вопрос.Еще раз спасибо :) – Flipybitz

3

Попробуйте эту модель: /(?:\b\w(?:\s|$)){3,}/g

Это использует граничное слово метасимволы \b так что вы получите надлежащее целое слово матч вместо частичное совпадение увидели с FrankerZ. Кроме того, бит \s|$ обращается к тому, что последняя буква теряется, когда после нее не возникает пробега, например, «Т» в R I O T.

Пример:

var inputs = [ 
    "R I", 
    "R I O T", 
    "FrankerZ R I O T FrankerZ", 
    "f o o b a r" 
]; 

var re = /(?:\b\w(?:\s|$)){3,}/g; 

inputs.forEach(function(s) { 
    var match = s.match(re); 
    if (match) { 
    var result = match[0].replace(/\s/g, ''); 
    console.log('Original: ' + s); 
    console.log('Result: ' + result); 
    } else { 
    console.log('No match: ' + s); 
    } 
}); 

Демонстрация: JSBin

EDIT: обновление, чтобы покрыть 3+ отдельных букв и пример ни одного совпадения.

+0

Да, это сработало, но по-прежнему применяется к «R I» и «R I O», когда я хотел бы, чтобы это было применимо к 3 или более однобуквенным словам. Я отправил свой ответ, который делает что-то похожее на это, но работает с моим сценарием. Благодаря! – Flipybitz

+1

Вместо кванта '+' используйте '{3,}'. – Purag

+0

@Flipybitz легко фиксируется с помощью '{3,}' вместо '+'. –

0

Вы будете иметь проблемы с решением всей этой проблемы с помощью регулярных выражений.

не

То есть, нет регулярное выражение, которое будет делать все из следующих действий:

  • выберите ничего, пока вы не заинтересованы в
  • захвата все, что вы заинтересованы в
  • захвата переменное количество совпадений

Последнее требование - переменное количество захватов - большое. Пользователь StackOverflow Tomalak described the situation quite well:

Группы определяются круглыми скобками. Результат вашего совпадения будет содержать столько групп, сколько в круглых скобках будет содержать пары круглых скобок (кроме измененных круглых скобок, таких как (?: ...), которые не будут учитываться в группах соответствия). Хотите два отдельных групповых матча в вашем результате матча? Определите две отдельные группы в вашем регулярном выражении.

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

Вы все еще можете позволить регулярному выражению делать много работы, хотя, например, с использованием \b краевыми из-слов якоря. Это очень похоже на то, что вы описывали как «пространство до и после него», но ближе к тому, что вы хотите, потому что оно не соответствует (или даже требует) самого пространства.

> "R I O T".match(/\b\w\b/g) 
["R", "I", "O", "T"] 
> "FrankerZ R FrankerZ I FrankerZ O FrankerZ T".match(/\b\w\b/g) 
["R", "I", "O", "T"] 

Вы хотели квантификации, и, конечно, это регулярное выражение не содержит кванторов:

> "test a b test".match(/\b\w\b/g) 
["a", "b"] 

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

var individual_letters_re = /\b\w\b/g; 

function hiddenWord(sentence) { 
    letters = sentence.match(individual_letters_re); 
    if (letters && letters.length >= 3) { 
     return letters.join(""); 
    } 
    return ""; 
} 

> hiddenWord("R I O T") 
"RIOT" 
> hiddenWord("FrankerZ R FrankerZ I FrankerZ O FrankerZ T") 
"RIOT" 
> hiddenWord("test a b test") 
"" 
> hiddenWord("test a b c test") 
"abc" 
0

Попробуйте это на терминале/браузер/консоль:

var text = "FrankerZ R I O T FrankerZ"; 
var new_text = text.replace(/(\s\S(?=\s)){3,}/g, function(w){ 
    return(' ' + w.replace(/\s/g, '')); 
}); 
console.log(new_text); 

Надеюсь, что это нужно.

Смежные вопросы