Regex 使用正则表达式的PL/SQL键值字符串

Regex 使用正则表达式的PL/SQL键值字符串,regex,plsql,Regex,Plsql,我有一个字符串以如下键值格式存储在表中:“Key1☺价值1☺键2☺价值2☺凯恩☺瓦伦☺". 给定一个键如何提取值?正则表达式是处理这个问题的最简单方法吗?我对PL/SQL和正则表达式都是新手。在这种情况下,我将只使用一个常规拆分并迭代生成的数组 public string GetValue(string keyValuePairedInput, string key, char separator) { var split = keyValuePairedInput.Split(sep

我有一个字符串以如下键值格式存储在表中:“Key1☺价值1☺键2☺价值2☺凯恩☺瓦伦☺".
给定一个键如何提取值?正则表达式是处理这个问题的最简单方法吗?我对PL/SQL和正则表达式都是新手。

在这种情况下,我将只使用一个常规拆分并迭代生成的数组

public string GetValue(string keyValuePairedInput, string key, char separator)
{
    var split = keyValuePairedInput.Split(separator);

    if(split.Lenght % 2 == 1)
        throw new KeyWithoutValueException();

    for(int i = 0; i < split.Lenght; i += 2)
    {
        if(split[i] == key)
            return split[i + 1];
    }

    throw new KeyNotFoundException();
}

对于PL/SQL中的这种字符串切片和切分,您可能必须使用正则表达式。Oracle有许多可以使用的正则表达式。最常用的是
REGEXP\u LIKE
,它与
LIKE
运算符非常相似,但不进行正则表达式匹配


但是,您可能需要使用<代码> ReXExpITENC <代码>查找分隔符,然后使用<代码>子字符串< /代码>函数在匹配的位置上分割字符串。您也可以考虑使用<代码> RetrExpaseBase< /Cord>一步进行正则表达式匹配和切片。压力

假设您有这样的输入: 键1,值1 |键2,值2 |键3,值3

您可以使用一些PL/SQL,如下所示:

   FUNCTION get_value_by_key
   (
      p_str           VARCHAR2
    , p_key           VARCHAR2
    , p_kvp_separator VARCHAR2
    , p_kv_separator  VARCHAR2
   ) RETURN VARCHAR2
    AS
      v_key   VARCHAR2(32767);
      v_value VARCHAR2(32767);
      v_which NUMBER;      
      v_cur   VARCHAR(1);
    BEGIN
      v_which := 0;
      FOR i IN 1..length(p_str)
      LOOP
         v_cur := substr(p_str,i,1);         
         IF v_cur = p_kvp_separator
         THEN
            IF v_key = p_key
            THEN
               EXIT;
            END IF;
            v_key := '';
            v_value := '';
            v_which := 0;
         ELSIF v_cur = p_kv_separator
         THEN
            v_which := 1;
         ELSE
            IF v_which = 0
            THEN
               v_key := v_key || v_cur;
            ELSE
               v_value := v_value || v_cur;
            END IF;
         END IF;
      END LOOP;

      IF v_key = p_key
      THEN
         RETURN v_value;
      END IF;
      raise_application_error(-20001, 'key not found!');      
   END;
要获取“Key2”的值,可以这样做(假设函数位于名为test_pkg的包中):


我在看“笑脸”“在您的键值格式中。那是什么角色?你是说烟斗吗?e、 g.Key1,Value1 | Key2,Value2 | Key3,value3操作它是一个字符,'\1',用于键、值和对之间。通常您有一个单独的分隔符来分隔键、值及其对。但是,如果用于分隔符的字符与键或值中可能出现的字符相同,则存在问题。我在下面发布的代码假设输入中不会出现这两个分隔符,并且这两个分隔符不同。
   FUNCTION get_value_by_key
   (
      p_str           VARCHAR2
    , p_key           VARCHAR2
    , p_kvp_separator VARCHAR2
    , p_kv_separator  VARCHAR2
   ) RETURN VARCHAR2
    AS
      v_key   VARCHAR2(32767);
      v_value VARCHAR2(32767);
      v_which NUMBER;      
      v_cur   VARCHAR(1);
    BEGIN
      v_which := 0;
      FOR i IN 1..length(p_str)
      LOOP
         v_cur := substr(p_str,i,1);         
         IF v_cur = p_kvp_separator
         THEN
            IF v_key = p_key
            THEN
               EXIT;
            END IF;
            v_key := '';
            v_value := '';
            v_which := 0;
         ELSIF v_cur = p_kv_separator
         THEN
            v_which := 1;
         ELSE
            IF v_which = 0
            THEN
               v_key := v_key || v_cur;
            ELSE
               v_value := v_value || v_cur;
            END IF;
         END IF;
      END LOOP;

      IF v_key = p_key
      THEN
         RETURN v_value;
      END IF;
      raise_application_error(-20001, 'key not found!');      
   END;
SELECT test_pkg.get_value_by_key('Key1,Value1|Key2,Value2|Key3,Value3','Key2','|',',') FROM dual