Java String.replaceFirst (), который берет “запуск с” аргумента

Я должен заменить слово в строке, бывшей похожей "понятное дело понятное дело что-то еще понятное дело". Я только должен заменить второе "понятное дело", но первое и последние должны остаться нетронутыми, таким образом, замена () и replaceFirst () не работает. Существует ли метод как replaceFirst (Представьте в виде строки regex, Строковую замену, международное смещение), который заменил бы первое вхождение замены, начинающей со смещения, или возможно Вы рекомендуете некоторому другому способу решить это?Спасибо!

7
задан polygenelubricants 24 February 2010 в 21:35
поделиться

3 ответа

А что насчет такого:

String replaceFirstFrom(String str, int from, String regex, String replacement)
{
    String prefix = str.substring(0, from);
    String rest = str.substring(from);
    rest = rest.replaceFirst(regex, replacement);
    return prefix+rest;
}

// or
s.substring(0,start) +  s.substring(start).replaceFirst(search, replace);

всего одна строка кода ... а не весь метод.

10
ответ дан 6 December 2019 в 12:50
поделиться

MEF управляет временем жизни создаваемых компонентов. В данном примере проблема заключается в том, что объект, который требуется утилизировать, фактически не создается MEF. Возможно, вы хотите сделать что-то подобное:

public class ComponentExporter : IDisposable
{
    private IMyInterface _component;

    [Export]
    public IMyInterface Component
    {
        get
        {
            if (_component != null)
            {
                _component = new MyImplementation();

                // ...
            }
            return _component;
        }
    }

    public void Dispose()
    {
        if (_component != null)
        {
            _component.Dispose();
        }
    }
}

ComponentExporter - это класс, фактически созданный MEF, и если он реализует IDisposable, то MEF распорядится им с контейнером. В этом примере ComponentExporter утилизирует созданный компонент при его утилизации, что, вероятно, является желаемым.

Конечно, было бы проще просто поместить экспорт непосредственно в класс MyImplementation. Я предполагаю, что у вас есть какая-то причина не делать этого, но так бы это выглядело:

[Export(typeof(IMyInterface))]
public class MyImplementation : IMyInterface, IDisposable
{
    // ...
}

Несколько других заметок в вашем коде: Вероятно, вам не нужно добавлять каталог в контейнер через пакет, если вы не импортируете его куда-либо и не модифицируете его из деталей внутри контейнера. И если вы обрабатываете много запросов и обеспокоены производительностью, вы должны создать AssemblyCatalog только один раз, а затем использовать один и тот же для всех запросов.

-121--3176620-

Чтобы увеличить силу пароля, следует использовать более широкий спектр символов. Если у вас есть 8-10 символов в пароле становится довольно трудно взломать. Хотя увеличение его длины сделает его более безопасным, только если вы используете числовые/алфавитные/другие символы.

SHA1 является другим алгоритмом хеширования (один путь шифрование), он медленнее, но имеет более длинный дайджест. (закодированное сообщение) (160 бит), где MD5 имеет только 128 бит.

Тогда SHA2 еще более безопасно, но он использовал меньше.

-121--1000404-

Сработает ли что-то подобное?

  System.out.println(
     "1 duh 2 duh duh 3 duh"
     .replaceFirst("(duh.*?)duh", "$1bleh")
  ); // prints "1 duh 2 bleh duh 3 duh"

Если вы просто хотите заменить второе вхождение образца в последовательности, вам действительно не нужно это вычисление индекса «начиная с».

В качестве бонуса, если вы хотите заменить каждый другой duh (т.е. второй, четвертый, шестой и т.д.), то просто вызовите repleyAll вместо repleyFirst .

4
ответ дан 6 December 2019 в 12:50
поделиться

Альтернатива - использование Matcher:

 String input = "duh duh something else duh";
 Pattern p = Pattern.compile("duh");
 Matcher m = p.matcher(input);
 int startIndex = 4;

 String output;

 if (m.find(startIndex)) {
     StringBuffer sb = new StringBuffer();
     m.appendReplacement(sb, "dog");
     m.appendTail(sb);
     output = sb.toString();
 } else {
     output = input;
 }
2
ответ дан 6 December 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: