Регулярное выражение Java - PullRequest
       0

Регулярное выражение Java

2 голосов
/ 31 декабря 2010

У меня есть следующая строка «product-code», и я хочу преобразовать ее в «productCode» с помощью регулярного выражения.

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

Но я не знаю, как это сделать ... кто-нибудь может мне помочь?

Большое спасибо.

Ответы [ 6 ]

4 голосов
/ 31 декабря 2010

Попробуйте использовать appendReplacement и appendTail - они очень гибкие и позволяют использовать произвольные процедуры для замены фрагментов строк.

package com.example.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CapitalizeDash {
    static public void main(String[] args)
    {
        test("ha----");
        test("onions");
        test("product-code");
        test("this-is-a-test");

    }

    // this matches a dash followed by any non-dash
    private static Pattern p = Pattern.compile("-([^-])");
    private static void test(String input) {
        System.out.println(capitalizeDash(input));
    }
    private static String capitalizeDash(String input) {
        StringBuffer sb = new StringBuffer();
        Matcher m = p.matcher(input);
        while (m.find())
        {
            m.appendReplacement(sb, m.group(1).toUpperCase());          
        }
        m.appendTail(sb);
        return sb.toString();       
    }
}
2 голосов
/ 31 декабря 2010

Это не так сложно, как кажется. Используя Pattern, Matcher и несколько групп регулярных выражений, это всего лишь несколько строк кода:

Pattern re = Pattern.compile("^([^-]+)-(.)(.*)$");
Matcher m = re.matcher("product-code");
if (m.matches())
{
    // Could do: s = m.group(1) + m.group(2).toUpperCase() + m.group(3)
    // Using a StringBuilder is more efficient, though.
    StringBuilder buf = new StringBuilder();
    buf.append(m.group(1));
    buf.append(m.group(2).toUpperCase());
    buf.append(m.group(3));
    System.out.println(buf.toString());
}

Превращение этого в общую функцию или метод оставлено читателю в качестве упражнения. ; -)

EDIT

Обработка нескольких совпадений:

String s = "product-code boo-yah";
Pattern re = Pattern.compile("^([^-]+)-(.)(.*)$");
Matcher m = re.matcher(s);
while (m.matches())
{
    s = m.group(1) + m.group(2).toUpperCase() + m.group(3);
    m = re.matcher(s);
}

System.out.println(s);

ПРИМЕЧАНИЕ. Я проверил этот код.

1 голос
/ 31 декабря 2010

Не нужно слишком усложнять ...

  String p = "product-code";
  String[] values = p.split("-");
  char[] letters = values[1].toCharArray();
  letters[0] =Character.toUpperCase(letters[0]);
  System.out.println(values[0]+String.copyValueOf(letters));
1 голос
/ 31 декабря 2010

Регулярные выражения предназначены для поиска строк, а не для их замены.Просто напишите простой код Java, например:

public static String convert(String text) {
    StringBuilder resp = new StringBuilder(text.length());
    boolean upper = false;
    for (int i = 0; i < text.length(); i++) {
        char ch = text.charAt(i);
        if (ch == '-') {
            upper = true;
        } else {
            if (upper) {
              ch = Character.toUpperCase(ch);
              upper = false;
            }
            resp.append(ch);
        }
    }
    return resp.toString();
}
0 голосов
/ 31 декабря 2010

Вот вариант, основанный на решении Джейсона С. (это означает, что я начал с его кода, а затем изменил его в соответствии со своими потребностями).Подсказка в том, что Guava имеет класс, который выполняет именно это преобразование, класс CaseFormat (или enum, если быть более точным).Поэтому я искал строчные слова с черточками и передавал их в конвертер CaseFormat.(Преобразование из LOWER_HYPHEN в LOWER_CAMEL)

public class CamelizeDashes {

    private static final Pattern WORD_WITH_DASHES =
        Pattern.compile("\\b(\\p{Lower}+(?:\\-\\p{Lower}+)+)\\b");

    private static String camelizeDashes(final String input) {
        final StringBuffer sb = new StringBuffer();
        final Matcher m = WORD_WITH_DASHES.matcher(input);
        while (m.find())
        {
            System.out.println("Match found: "+m.group());
            m.appendReplacement(sb, toCamelCase( m.group()));
        }
        m.appendTail(sb);
        return sb.toString();
    }
    public static void main(final String[] args)
    {
        test("Sed laoreet-neque-at libero luctus ultricies. Duis nulla justo, " +
            "tempor-nec viverra ut, convallis a diam. Praesent eget-nunc-sed " +
        "eros interdum sodales tempus-nec metus.");

    }
    private static void test(final String input) {
        System.out.println(camelizeDashes(input));
    }
    private static String toCamelCase(final String dashedword) {
        return CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, dashedword);
    }
}

Выход:

Соответствиенайдено: laoreet-neque-at
найдено совпадений: tempor-nec
найдено совпадений: eget-nunc-sed
найдено совпадений: tempus-nec
Sed laoreetNequeAt ulteric libo luctusDuis nulla justo, temporNec viverra ut, convallis a diam.Престижный egetNuncSed eros interdum sodales tempusNec metus.

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