2014-02-07 4 views
0

В моей базе данных MySQL у меня есть столбец строк в формате UTF-8, для которого я хочу, например, извлечь первый символ, используя RegEx.Извлечь первый символ каждого слова в MySQL с помощью RegEx

Предполагая RegEx, который только извлекает следующие символы:

ਹਮਜਰਣਚਕਨਖਲਨ 

А учитывая следующую строку:

ਹੁਕਮਿ ਰਜਾਈ ਚਲਣਾ ਨਾਨਕ ਲਿਖਿਆ ਨਾਲਿ ॥੧॥ 

только символы извлекаемые будет:

ਹਰਚਨਲਨ 

Я знаю, для решения этой проблемы потребуются следующие шаги:

  • Разбить строку на отдельные слова (подстроки), используя пространство в качестве разделителя
  • Для каждого слова экстракта первой буквы (подстрок подстроки), если она соответствует тому, что находится в регулярном выражении допустимых символов

Я рассмотрел все похожие вопросы/ответы на SO, и никто не смог решить мою проблему до сих пор.

+0

Вы посмотрели на это? http://stackoverflow.com/q/8313154/2812842 –

+0

Да, но это не очень полезный ответ –

ответ

0

Я, наконец, достиг этого с помощью моего друга-программиста.Я сразу вставить следующий фрагмент кода в SQL части моей базы данных в PhpMyAdmin:

delimiter $$ 
drop function if exists `initials`$$ 
CREATE FUNCTION `initials`(str text, expr text) RETURNS text CHARSET utf8 
begin 
    declare result text default ''; 
    declare buffer text default ''; 
    declare i int default 1; 
    if(str is null) then 
     return null; 
    end if; 
    set buffer = trim(str); 
    while i <= length(buffer) do 
     if substr(buffer, i, 1) regexp expr then 
      set result = concat(result, substr(buffer, i, 1)); 
      set i = i + 1; 
      while i <= length(buffer) and substr(buffer, i, 1) regexp expr do 
       set i = i + 1; 
      end while; 
      while i <= length(buffer) and substr(buffer, i, 1) not regexp expr do 
       set i = i + 1; 
      end while; 
     else 
      set i = i + 1; 
     end if; 
    end while; 
    return result; 
end$$ 

drop function if exists `acronym`$$ 
CREATE FUNCTION `acronym`(str text) RETURNS text CHARSET utf8 
begin 
    declare result text default ''; 
    set result = initials(str, '[ੴਓੳਅੲਸਹਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਵੜਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ਲ਼]'); 
    return result; 
end$$ 
delimiter ; 

UPDATE scriptures SET search = acronym(scripture) 

Просто объяснить последнюю строку:

  • scriptures является таблица Я хочу обновить
  • search это новый пустой столбец, который я создал внутри таблицы, чтобы сохранить результат.
  • scripture - это существующая колонка внутри таблицы scriptures со всеми t он натягивает Я хочу, чтобы извлечь из
  • acronym функция ранее объявившие, который стремится соответствовать первую букву каждого слова с персонажем из RegEx [ੴਓੳਅੲਸਹਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਵੜਸ਼ਖ਼ਗ਼ਜ਼ਫ਼ਲ਼]

Так что это последняя строка кода будет проходить через каждая строка столбца scripture, примените функцию acronym к ней и сохраните результат в новой колонке search.

Отлично! Именно то, что я искал :)

0

Я действительно не знаю, MySql Regex Синтаксис и ограничения (не используется), но вы можете добавить лидирующие пробелы перед строкой, и матч с чем-то простым, как это: «([ਮਜਰਣਚਕਨਖਲਨ] {1})»

Итак, если вы конкатенации подобранные группы вы будете иметь эту строку «ਰਚਨਲਨ» (только «ਹ» не соответствует, потому что это не существует в образце ")

в C# это может выглядеть следующим образом (рабочий образец):

namespace TestRegex 
{ 
    using System.Linq; 
    using System.Text.RegularExpressions; 
    using System.Windows.Forms; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // leading space(to match first word too) 
      // + sample string 
      var sample = " "; 
      sample += "ਹੁਕਮਿ ਰਜਾਈ ਚਲਣਾ ਨਾਨਕ ਲਿਖਿਆ ਨਾਲਿ ॥੧॥"; 

      // Regex pattern that will math space, and 
      // if next character in set - add it to "match group 1" 
      var pattern = " ([ਮਜਰਣਚਕਨਖਲਨ]{1})"; 

      // select every "match group 1" from matches as array 
      var result = from Match m in Regex.Matches(sample, pattern) 
         select m.Groups[1]; 

      // concatenate array content into one string and 
      // show it in message box to user, for example.. 
      MessageBox.Show(string.Concat(result)); 
     } 
    } 
} 

в большинстве запросов без запроса например, в php вам нужно сделать preg_match_all, а в цикле foreach добавить «$ match [i] [1]» (каждая «группа соответствия 1») из каждого совпадения до конца одной строки ,

хорошо .. симпатичный простой. но не для mysql ...

+0

У вас есть образец кода, который будет делать это? –

+0

Да (добавлено в ответ), но только на C#. – rufanov

+0

Большое спасибо за версию C#. Я тоже думал сделать это на PHP, но мне очень хотелось получить чистое SQL-решение –

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