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

Finding Pattern from one string to apply to another string - Java

所以我有这样一个字符串:<em>1234</em>56.70 它基本上是一个数字,其中 em 标签有助于识别要在字符串

中突出显示的内容

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

问题是,我丢失了高亮 (em) 标签。所以我需要把它放回格式化的字符串中,像这样:<em>3,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 3,456.70
highlightValue = someFunction(highlightValue); // this function needs to return <em>3,4</em>56.70

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

感谢所有帮助!

我假设你想突出显示从开始到一些 digits.This 可以完成的数字。 在初始字符串中,计算标签出现后的位数。起始标签将始终放在开头。这是您必须担心的结束标签。现在计算位数,不包括任何其他 symbols.When 已通过所需的位数,再次放置标签。您可以从 String highlighted 创建一个 StringBuilder 并直接插入标签字符串,或者将字符串分成两个子字符串,然后将它们与中间的标签字符串连接在一起。

希望对您有所帮助。

我不知道这怎么能实用。但无论如何。

    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 3,456.70

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

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

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

所以这是代码:

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