从一个字符串中查找模式以应用于另一个字符串 - Java

时间:2017-03-28 05:36:56

标签: java regex string format replaceall

所以我有一个这样的字符串:<em>1234</em>56.70 它基本上是一个数字,em标签有助于识别字符串中要突出显示的内容

我需要先将字符串转换为具有当前语言环境格式的实际数字。所以我删除em标签(由emptyString替换所有),然后使用numberFormat java API获取如下字符串:$123,456.70

问题是,我丢失了突出显示(em)标签。所以我需要将它放回格式化的字符串中,如下所示:<em>$123,4</em>56.70

highlightValue = "<em>1234</em>56.70";
highlightValue = highlightValue.replaceAll("<em>", "").replaceAll("</em>", ""); // highlightValue is now 123456.70
highlightValue = numberFormat.convertToFormat(highlightValue, currencyCode); // highlightValue is now $123,456.70
highlightValue = someFunction(highlightValue); // this function needs to return <em>$123,4</em>56.70

我不确定使用什么方法。我正在尝试模式匹配,但不知道如何实现它。

所有帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

我假设您要突出显示从开始到某些数字的数字。这可以完成。 在初始字符串计数中,标记出现之前的位数。起始标记始终位于开头。这是你必须担心的结束标记。现在计算位数,不包括任何其他符号。当已经传递了所需的位数时,再次放置标记。您可以从StringBuilder创建String highlighted并直接插入标记字符串,或将字符串分成两个子字符串,然后将它们与中间的标记字符串连接在一起。

希望这会有所帮助。

答案 1 :(得分:1)

我采用了一种方法,我在标签前面计算标签前面的数字 - 因为我认为没有格式化实际上会改变数字(假设你没有添加前导零),之后我根据标签前面的数字或前面和内面的结束标签插回标签

所以这是代码:

public static void main(String[] args) {
  String input1 = "<em>1234</em>56.70";
  String result1 = formatString(input1, "em");
  System.out.printf("input1  = %s%n", input1);
  System.out.printf("result1 = %s%n", result1);

  String input2 = "<em>8127</em>29.12";
  String result2 = formatString(input2, "em");
  System.out.printf("input2  = %s%n", input2);
  System.out.printf("result2 = %s%n", result2);
}

private static String formatString(String input, String tagName) {
  String tagOpening = String.format("<%s>", tagName);
  int tagOpeningLength = tagOpening.length();
  String tagClosing = String.format("</%s>", tagName);
  int tagClosingLength = tagClosing.length();

  int inputLength = input.length();


  int tagOpeningPos = input.indexOf(tagOpening);
  int tagClosingPos = input.indexOf(tagClosing, tagOpeningPos);

  String beforeTag;
  if(tagOpeningPos > 0)
    beforeTag = input.substring(0, tagOpeningPos);
  else
    beforeTag = "";
  int digitsInBeforeTag = countNumbers(beforeTag);

  String tagValue;
  if(tagOpeningPos + tagOpeningLength < tagClosingPos)
    tagValue = input.substring(tagOpeningPos + tagOpeningLength, tagClosingPos);
  else 
    tagValue = "";
  int digitsInTagValue = countNumbers(tagValue);

  String afterTag;
  if((tagClosingPos + tagClosingLength) <  inputLength)
    afterTag = input.substring(tagClosingPos + tagClosingLength);
  else
    afterTag = "";

  String valueToBeFormatted = beforeTag + tagValue + afterTag;
  double value = Double.parseDouble(valueToBeFormatted);

  NumberFormat nf = NumberFormat.getInstance(Locale.ENGLISH);

  String formattedValue = nf.format(value);

  int newEmOpeningPos = findSubstringWithThisManyNumbers(formattedValue, digitsInBeforeTag);
  int newEmClosingPos = findSubstringWithThisManyNumbers(formattedValue, digitsInBeforeTag+digitsInTagValue);

  StringBuilder result = new StringBuilder();

  result.append(formattedValue.substring(0, newEmOpeningPos));
  result.append(tagOpening);
  result.append(formattedValue.substring(newEmOpeningPos, newEmClosingPos));
  result.append(tagClosing);
  result.append(formattedValue.substring(newEmClosingPos));

  return result.toString();
}

private static int findSubstringWithThisManyNumbers(String input, int digitCount) {
  int pos = 0;

  int counter = 0;
  for(char c : input.toCharArray()) {
    if(counter >= digitCount)
      break;

    if(Character.isDigit(c))
      counter++;

    pos++;
  }

  return pos;
}

private static int countNumbers(String str) {
  int result = 0;
  for(char c : str.toCharArray())
    if(Character.isDigit(c))
      result++;
  return result;
}

输出

input1  = <em>1234</em>56.70
result1 = <em>123,4</em>56.7
input2  = <em>8127</em>29.12
result2 = <em>812,7</em>29.12

答案 2 :(得分:0)

我不知道这怎么可行。但无论如何。

    String highlightValue = "0<em>1234</em>56.70";
    int startIndex = highlightValue.indexOf("<em>");
    String startString = highlightValue.substring(0, startIndex);
    String endString = highlightValue.substring(highlightValue.indexOf("</em>") + "</em>".length());

    highlightValue = highlightValue.replaceAll("<em>", "").replaceAll("</em>", "");
    highlightValue = numberFormat.convertToFormat(highlightValue, currencyCode);
    // highlightValue is now $123,456.70

    int endIndex = highlightValue.indexOf(endString);
    highlightValue = startString + "<em>" + highlightValue.substring(0, endIndex) + "</em>" + endString;

    System.out.println(highlightValue);
    // 0<em>$123,4</em>56.70